出力リダイレクション

出力リダイレクション

標準入力・出力、エラー出力

シェルでの実行結果は画面上に表示されます。

「$ pwd」とシェルに入力するとpwdコマンドの実行結果「カレントディレクトリの表示」が画面上に出力されます。

「$ home/komeyan」です。

シェルの実行は「入力→シェル(bash)→出力」というような流れで行われます。

上の例ではユーザーによるキーボードでの入力でコマンド「pwd」がシェルに送られます。

そしてpwdコマンドの実行結果が出力として画面上に表示されます。

  1. キーボード入力:標準入力
  2. 画面上出力:標準出力

といいます。また、コマンドは常に成功するとは限りません。例えばファイルの内容を表示するコマンド「cat file1」と入力した際に「file1」が存在しない場合は中身が表示できないので、「No such file」などとエラー表示されます。これも画面上に出力されます。これを含めて

  1. 標準入力 ← キーボード :0番
  2. 標準出力 → 画面 :1番
  3. 標準エラー出力 → 画面 :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

コメントを残す

メールアドレスが公開されることはありません。