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で指定されてるもの) |
| $? | 直前のコマンドの終了ステータス |