tarでアーカイブを作るときの fオプション がないときの挙動を調べたことまとめ
知りたいこと
tarコマンドで.tarや.tar.gzを作るときにf`オプションを付けなかったときの挙動。 なるべく環境依存があるかどうかなども含めて把握したい。
なぜfオプションなしの挙動が知りたいか?
まずfオプションのロングオプションは--file。
fオプションをつけない挙動が知りたいのは、tarがものすごく覚えやすく、パイプを活用して他のコマンドと繋げやすくなるから。
$ tar c ./mydir > mydir.tar
色々とオプションが多いイメージのtarコマンドだがtar c ディレクトリをリダイレクトでファイルに保存すれば良いだけで今すぐ覚えられる! .tar.gzが欲しければzを付けるだけでOK。
$ tar cz ./mydir > mydir.tar.gz
tarコマンドのfオプションなしを調べても情報がかなり少ない
tarの例には必ずといって良いほどfオプションが付いている。
標準出力にtarのバイナリを履く方法はtar cf - ./mydirのようにf -を使うことが紹介される。
man tarの情報もアーカイブを作成するときよりも展開するときの説明が多い気がする。
まずは各種OSなどでの挙動
検証したい挙動: tar c ./varでtarバイナリが吐かれるかどうか?
検証方法: tar c ./var | file -で/dev/stdin: POSIX tar archiveが返るかを確認している。
標準出力にtarバイナリが吐かれる。
標準出力にtarバイナリが吐かれる。
標準出力にtarバイナリが吐かれる。
標準出力にtarバイナリが吐かれる。
標準出力にtarバイナリが吐かれる。
挙動を確認したすべてのOSで「標準出力にtarバイナリが吐かれる」。基本的にはtarを作りたいならtar c mydir > mydir.tarで作れる。
manを読む
GNU TAR Manual
以下の引用を見ると、fオプションの指定がないときは環境変数$TAPEに.tarを書き出すことが分かる。
If this option is not
given, tar will first examine the environment variable `TAPE'.
If it is set, its value will be used as the archive name.
実際に、export TAPE=mytarみたいにするとmytarができてtar形式だった。
現代の多くの人が環境変数$TAPEを指定してはなさそう(ソースなし)。
そして以下のように続き、$TAPEがないときは--show-defaultsで出てくるオプションがデフォルトになるということが分かる。
Otherwise, tar will assume the compiled-in default. The
default value can be inspected either using the
--show-defaults option, or at the end of the tar --help out‐
put.
以下はtar --show-defaultsの結果。-f-となっていて標準出力にtarバイナリがデフォルトで吐かれることが分かる。
code:console
$ tar --show-defaults
--format=gnu -f- -b20 --quoting-style=escape --rmt-command=/usr/lib/tar/rmt --rsh-command=/usr/bin/rsh
ただこういうデフォルトのフラグはビルド時のパラメータなどで決められる可能性もあり、ビルドした人によって異なる可能性も考慮しておく必要がありそう。
BSD General Commands Manual
以下でfオプション説明の全部。GNUの実装と比べて説明は少ない。 -f file
Read the archive from or write the archive to the specified file. The
filename can be - for standard input or standard output.
上記に環境変数$TAPEに関しても説明はないが試しにexport TAPE=mytarしても、環境変数が定義されてないときと挙動は変わらなかった。
WIP: Oracle Solaris 11.1
...
WIP:
https://gyazo.com/4064afe0b9918569c48dc72a4397c7ba