AWS CLI を使って S3 オブジェクトの中身を保存せずに確認する方法と、シェルにおけるハイフンに関するメモ


AWS CLI で S3 オブジェクトの中身を確認する

  • 以下のようなコマンドで、 S3 オブジェクトを標準出力に出力できる

    aws s3 cp s3://mybucket/myobject -
  • なので S3 オブジェクトとして保存してある JSON をいい感じみたい場合は、以下のようにすると良い

    aws s3 cp s3://mybucket/myobject - | jq .
  • gzip 化された JSON なら gunzip を挟めば良い

    aws s3 cp s3://mybucket/myobject - | gunzip | jq .
  • duckdb に標準入力経由で入力して分析しちゃったりもできちゃう

- って何なの?

  • この - ハイフンの正体は POSIX や GNU Coding Standards から始まった慣習らしい?
    • 少なくとも AWS CLI が独自に提供している機能や規格ではない
  • 基本的に標準入出力を意味しており、指定したコンテキストによって標準入力になったり標準出力になったりする
    • 今回の例では標準出力になっている
    • aws s3 cp s3://mybucket/myobjet -
  • 例えば以下のようなコマンド指定をすると標準入力になり、入力された値を出力するという動作になる
    • cat -

GNU Coding Standards
https://www.gnu.org/prep/standards/standards.html#Command_002dLine-Interfaces

It is a good idea to follow the POSIX guidelines for the command-line options of a program. The easiest way to do this is to use getopt to parse them. Note that the GNU version of getopt will normally permit options anywhere among the arguments unless the special argument ‘–’ is used. This is not what POSIX specifies; it is a GNU extension.

Bash Reference Manual
https://www.gnu.org/software/bash/manual/bash.html

Unless otherwise noted, each builtin command documented as accepting options preceded by ‘-’ accepts ‘–’ to signify the end of the options. The :, true, false, and test/[ builtins do not accept options and do not treat ‘–’ specially. The exit, logout, return, break, continue, let, and shift builtins accept and process arguments beginning with ‘-’ without requiring ‘–’. Other builtins that accept arguments but are not specified as accepting options interpret arguments beginning with ‘-’ as invalid options and require ‘–’ to prevent this interpretation.

  • 少し異なるトピックだが -- を指定するという慣習もある
  • これは個人的には npm を使う際によく見かける
    • 例えば npm run dev するときにポートを指定したい場合は npm run dev -- --port 8080 のように指定する
      • これは多くの場合 vite コマンドを npm 経由で使っているのだが、 npm run dev --port 8080 のような指定だと npm に対するオプション指定と判別することが困難なため、 -- を指定することで npm 経由で起動する vite コマンドに対してオプション指定するというスキームになっている

コマンドラインインターフェイス | Vite
https://ja.vite.dev/guide/cli

–port ポートを指定する(number)

おそらく以上の慣習を多くのプログラミング言語や引数をパースするライブラリが踏襲しており、まぁ常識でしょ?みたいな扱いになっているのだと思われる。