Shell

シェルスクリプトの入門編11:リダイレクトについて

ども、シローです。

今回はリダイレクトについて整理していきたいと思います。

リダイレクトをうまく使うことで、コマンドの出力をファイルにコピーしたり、ファイルから読み取った内容をコマンドに渡すことができます。

リダイレクトの記号一覧

記号 内容
< file 標準入力をfileに変更する
> file 標準出力をfileに変更する
>> file 標準出力の末尾に追加する
>| file noclobberの設定を無視して標準出力をfileに変更する
2> file 標準エラー出力をfileに変更する
2>> file 標準エラー出力をfileの末尾に変更する
2>| file noclobberの設定を無視して標準エラーをfileに変更する
>&m 標準出力をファイルディスクリプタm番にコピーする
n>&m ファイルディスクリプタn番をファイルディスクリプタm番にコピーする

標準入出力について

コマンドを実行するための入力元や実行後の出力先

名前 内容
標準入力(stdin) 標準的な入力元。通常はキーボード
標準出力(stdout) 標準的な出力先。通常は端末ディスプレイ
標準エラー出力(stderr) 標準的なエラー出力先。通常は端末ディスプレイ

標準入出力とファイルディスクリプタの番号

コマンドをリダイレクトするときの、標準入出力に対応するのがファイルディスクリプタの番号

名前 ファイルディスクリプタの番号
標準入力 0
標準出力 1
標準エラー出力 2

noclobberとは

標準出力先のファイルがすでに存在して、内容が記述されているときに上書きして元の内容が消えてしまうのを防ぐオプション

set -o noclobberを打つと既に記述されているファイルの上書きはできなくなる

set + noclobberと打つとnoclobberが解除される

 

色んな例

出力した内容をファイルに記述する

result.txtにls /usrした結果が格納される

エラー出力を標準出力を別々のファイルに分けて記述する

 

標準出力内容をファイルの末尾に追記する

標準出力と標準エラー出力を同じファイルに記述する

※リダイレクトの位置を間違えると失敗する

&>を使うと標準出力とエラー出力を一緒にまとめてファイルに記述できる

 

エラー出力を無視する

2>でエラー出力先を指定して、その場所を/dev/nullという入れたものを全て無にするところにするとエラー内容を無視して標準出力だけが表示される。

ファイルから読み取ったテキストを標準入力にしてコマンドを実行

trコマンドで受け取る入力値をword.txtの内容に設定している。

※標準入力と標準出力に同じファイルを指定すると、そのファイルが空になるのは注意

これは標準出力先に指定した時点でそのファイルが空になって、その内容を標準入力で読み取って、結果(もちろん空)をファイルに記述しているからです。

 

まとめ

  • リダイレクトを使うと、コマンドの入力や出力をテキストファイルに設定できる
  • 重要なファイルへの上書きを避けるためには、noclobberオプションがある
  • 標準エラー出力を、標準出力を一緒にするためには2>&1 file、あるいは&> file
  • 標準エラーのみを別ファイルに出力したい場合は2> file
  • この記事を書いた人

シロー

Webシステムの開発のお仕事をさせて頂いております。 フリーランスの日常、Web開発に関する情報を発信しています。 趣味はゲーム、映画鑑賞、個人サービスを作ることです。

-Shell

© 2021 Shiro's secret base