標準入力・出力、エラー出力
シェルでの実行結果は画面上に表示されます。
「$ pwd」とシェルに入力するとpwdコマンドの実行結果「カレントディレクトリの表示」が画面上に出力されます。
「$ home/komeyan」です。
シェルの実行は「入力→シェル(bash)→出力」というような流れで行われます。
上の例ではユーザーによるキーボードでの入力でコマンド「pwd」がシェルに送られます。
そしてpwdコマンドの実行結果が出力として画面上に表示されます。
- キーボード入力:標準入力
- 画面上出力:標準出力
といいます。また、コマンドは常に成功するとは限りません。例えばファイルの内容を表示するコマンド「cat file1」と入力した際に「file1」が存在しない場合は中身が表示できないので、「No such file」などとエラー表示されます。これも画面上に出力されます。これを含めて
- 標準入力 ← キーボード :0番
- 標準出力 → 画面 :1番
- 標準エラー出力 → 画面 :2番
3種類の入出力があります。0番などの番号はファイル記述子といって、入出力を指定したいときに利用します。これについては後述します。
出力リダイレクション
出力先は通常は画面上ですが、出力をファイルに保存したいという場合もあります。
出力先を変更するのが「出力リダイレクション」です。出力変更するには「>」を使います。
ファイルへ出力(書き込み)
標準出力を画面上ではなく、指定したファイルに出力(書き込む)こともできます。
標準出力の識別番号は「1」です。この標準出力先を「画面」から「ファイル」に変更します。
例えば日付を表示するコマンド「date」を使うと画面上に「Sun Jun 12 10:00:00 JST 2020」と表示されます。
この出力先を画面からファイルに変更するには「1>」を使います。シェル上には「date 1> file1」と入力します。
するとfile1に「Sun Jun 12 10:00:00 JST 2020」が書き込まれます。標準出力「1」を>file1に書き込むという意味です。ちなみに「1>」は「>」でもOKです。
ファイルへ出力(追記書き込み)
一度書き込んだファイル「date 1> file1」に再度書き込みを行うと「date 1> file1」出力「cat file1」はどうなるでしょうか?
画面上には「Sun Jun 12 10:00:00 JST 2020」が表示されます。すなわちファイルへの出力リダイレクションは「上書き」になります。
上書きせずにファイルの末尾に書き込むには「>>」を使います。
「date >> file1」では追記書き込みされて
Sun Jun 12 10:00:00 JST 2020
Sun Jun 12 10:00:00 JST 2020
と表示されます。
エラー出力先を変更する
エラー出力も標準出力と同じように出力先を変更できます。エラー出力は「2」です。nofileは存在しないファイルです。
「$ cat nofile 2> error_file」とシェルに打ち込むとerror_fileには「cat: nofile: No such file or directory」と書き込まれます。
エラー出力と標準出力先を指定「2>&1」
存在しないファイル「nofile」をcatコマンド表示「cat nofile」すると「cat: nofile: No such file or directory」とエラー出力されます。
さて次に「cat nofile > error.txt」とするとerror.txtには何が書き込まれているでしょうか?実際に出力してみると「cat error.txt」には何も出力されません。そしてその代わりに画面上に「cat: nofile: No such file or directory」が出力されます。
つまり「cat nofile > error.txt」の意味するところは標準出力がerror.txtに、エラー出力は画面出力です。番号が省略されているのでわかりにくいですが、実際は「cat nofile 1> error.txt」です。なのでエラー出力は画面上にでてきます。
ではエラー出力もファイルに書き込みたい場合はどうすればよいでしょうか?
「cat nofile 2>&1 out.txt」と書くとどうなるでしょう。これの意味は「標準エラー2の出力先を標準出力1と一緒にするという意味」です。標準出力1は画面出力なのでエラー出力は画面出力になります。パット見ではout.txtに出力されそうですが、これは書いてあるだけで全く意味のない記述になります。もちろん&1がなければエラー出力はファイルに出力されます。
さて、次に「cat nofile > out.txt 2>&1」と実行するとどうなるでしょうか?「cat nofile」とするとnofileには「cat: nofile: No such file or directory」と書かれています。意味は標準出力1をout.txtに出力し、nofileがない場合にはエラーが出力されますが、エラー出力2は1と一緒に出力されます。だからエラー出力がout.txtに書き込まれます。
https://qiita.com/tsubasaogawa/items/9495ad6e903998c4d1ac
/dev/nullに捨てる
「/dev/null」は特殊なファイルです。ゴミ箱と考えてよいと思います。ここによく出力を捨てるということが行われます。いちいちコマンドを実行したときに画面にエラー出力が出るのを避けたいときに使います。
「cat nofile 2>&1 /dev/null」を実行するとどうなるでしょうか?これは標準出力もエラー出力も/dev/nullに出力される。つまり全出力を捨てるという意味です。
これはどんな時に使われるでしょうか?
「cd /uso > /dev/null 2>&1」
存在しないディレクトリに移動しようとするとエラーが出力されるはずです。このように書くと全出力は/dev/nullに出力されるので何も表示されません。そして/usoというディレクトリは存在しないので/usoには移動できません。
出力リダイレクト先がroot権限のファイルに書き込む方法!
https://pasela.hatenablog.com/entry/20090204/sudo_redirect