Linuxのコマンドを使う際によく大なり記号(>
)や小なり記号(<
)、パイプ(|
)が出てくるけどこれってなんだ?
コマンドを連結するパイプ(|
)
役割:|
の前にあるコマンドの出力を、|
の後にあるコマンドの入力とする
$ echo "hello world"
hello world
(echo
は入力したものをそのまま出力してくれるコマンド)
ここでは"hello world"と打って画面に標準出力しました($
マークはコマンドプロンプトです)。
その結果をrev
コマンドの標準入力として実行したのが次です:
$ echo "hello world" | rev
dlrow olleh
(rev
は入力した文字列を逆さまにして返すコマンド)
つまり上の例では echo
コマンドの出力を直接rev
コマンドに入力したということです。
ちなみに、パイプは複数個繋げることが出来ます。
>
を使ってファイルに出力する
役割:コマンドの実行結果を指定のファイルへ直接出力してくれる
$ echo "hello world" > result.txt
このように実行すると、result.txtに「hello world」が書き込まれます。
続けて、
$ echo "holy shit" > result.txt
と実行すると、result.txtに「holy shit」が上書きされます。すなわち先に書き込んだ「hello world」は消えてしまいます。
追記をするには>
の代わりに>>
を使います。
$ echo "hello world" > result.txt
$ echo "holy shit" >> result.txt
このように実行すれば、result.txtには「hello world」と「holy shit」の両方が書き込まれます。
>
と|
の合わせ技
command1 < file.txt | command2
これは、file.txtの内容をcommand1
への入力とし、そしてcommand1
の出力をcommand2
の入力とするという意味。
大なり記号と数字
(ここからは応用です)
「標準入力」・「標準出力」・「標準エラー出力」にはそれぞれ次のように番号が割り振られています。
意味 | 番号 |
---|---|
標準入力 | 0 |
標準出力 | 1 |
標準エラー出力 | 2 |
そして、大なり記号>
は、実は1>
のように数字の"1"が省略されています。
同様にして2>
も使えるんです。
つまり
$ command 2> error.txt
とすると、command
を実行した際に表示されたエラーの内容が、error.txtに出力されます。
以下は、存在しないコマンドkjfklsajf
を実行した例です:
$ kjfklsajf
zsh: command not found: kjfklsajf
$ kjfklsajf 2> error.txt
$
一回目の実行では「zsh: command not found: kjfklsajf」とエラーである旨が表示されました。しかし、二回目ではそのエラーを2>
を使ってerror.txtに出力したため、結果的にerror.txtに「zsh: command not found: kjfklsajf」が書き込まれました。
また、エラー出力を追記するなら2>>
を使えばよいということです。
標準出力と標準エラー出力を同じファイルへ
command > file.txt 2>&1
これは「file.txtに標準出力と標準エラー出力を書き込む」という意味です。
末尾にある2>&1
より、標準エラー出力先は、現在の標準出力先、つまりfile.txtということです。
標準出力と標準エラー出力を同じファイルに書き込みたい場合は特別な記法があり
command &> file.txt
と実行すれば実現できます。
(追記)引数を表す変数
変数名 | 説明 |
---|---|
$0 | 0番目の引数(ファイル名) |
$1 | 1番目の引数 |
$2 | 2番目の引数(2番目以降も同様) |
$# | 引数の個数(ファイル名はカウントされない) |
$@ | すべての引数(スペース区切り) |
$* | すべての引数(区切りは環境変数IFS で指定されてるもの) |
$? | 直前のコマンドの終了ステータス |