アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下は、tarとsshコマンドを組み合わせて一行で実行しているコマンドなのですが、やってることがいまいちわかりません。どなたか詳しい方説明していただけないでしょうか。

tar -cvf '-' /root/backup | ssh 192.168.1.2 "cat '-' > /tmp.tar"

自分なりの理解は以下の通りで、謎なところを解説していただければ非常に助かります。。

分解してみていきます。

1 tar -cvf '-' /root/backup
tarで/root/backupを固めいている。
(謎1) -cvfあとの '-' は何なんでしょうか?

2 | ssh 192.168.1.2
パイプでつないでssh接続

3"cat '-' > /tmp.tar"
(謎2)全体的に謎です。。

たぶん'-'が理解できればわかるのかな・・?

詳しい方ぜひご教授下さい。よろしくお願いいたします。

A 回答 (1件)

説明は難しいですね。


'-'の意味はtarやcat等のコマンドの作りに依存しますが、一般的にUNIX系のコマンドでは状況に応じて標準入力、または、標準出力を意味します。
標準入力、標準出力は本来は端末画面に表示されるもの、ぐらいの理解でとりあえずは良いのではないでしょうか。

i)パイプ'|'は左側のコマンドの標準出力を右側の標準入力に接続します。

ii)リダイレクト'>'は左側のコマンドの標準出力を、右側に指定したファイルに出力します。

iii)"cat /etc/group | cat '-' > ~/group"は"cp /etc/group ~/group"とだいたい同じ動きをします。

これを踏まえて説明してみます。

(謎1の説明) tarの"-f"オプションに'-'を指定すると、標準出力に”tmp.tarの内容”を出力します。
パイプが右側にあるので、画面には出力されずにパイプの右側にあるコマンドに渡されます。

(謎2の説明) ”| cat '-' > /tmp.tar”でパイプの左側のコマンドが出力した内容、この場合は"tmp.tarの内容"、を持つファイル(/tmp.tar)を作成します。
今回はパイプとcatコマンドの間に"ssh 192.168.1.2"が割り込んでいます。

さらっと流した"| ssh 192.168.1.2"のところが理解する上では難しいかもしれません。
やっている事はパイプ'|'とcatコマンドの間に入って、192.168.1.2上で"cat '-' > /tmp.tar"を実行しています。
ただcatコマンドを実行する前にパイプの左側の標準出力とcatコマンドの標準入力を接続してデータが流れるようにしています。
sshが干渉せずにデータが流れるように動いてくれるため、192.168.1.2上に/tmp.tarファイルが作成されます。

参考までに、同一ホスト上に/tmp.tarを作成する次の4つのコマンドは同じ動きになります。
# tar -cvf /tmp.tar /root/backup
# tar -cvf '-' /root/backup > /tmp.tar
# tar -cvf '-' /root/backup | cat '-' > /tmp.tar
# tar -cvf '-' /root/backup | ssh localhost "cat '-' > /tmp.tar"

192.168.1.2のsshdにはそれなりの設定がされていると思います。最後の例はそのまま実行しようとしても、sshdの設定によってエラーになるかもしれません。

"cat '-'"と"cat"は同じ意味とか、標準入出力のちゃんとした説明とか、いろいろ不足しているとは思いますが、理解できているところ、いないところを整理する手助けになれば幸いです。
以上
    • good
    • 0
この回答へのお礼

なるほど!
分かりやすい解説ありがとうございました!

お礼日時:2009/12/08 00:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!