「下記ファイルディスクリプタがプロセスと結びつける対象ファイル」を別のファイルに変更することをリダイレクションとよびます。実際には、ファイルディスクリプタ1と2の対象ファイルの変更を指すことが多いです。
ファイルディスクリプタとは?
ファイルディスクリプタは「プロセス」と「プロセスが使用するファイル」を結びつけるもので、それらには0,1,2,...と連続した番号が割り当てられています。ファイルディスクリプタ0,1,2は既定値として存在しており、
- 0: 標準入力とプロセスを結び付けるファイルディスクリプタ
- 1: 標準出力とプロセスを結び付けるファイルディスクリプタ
- 2: 標準エラー出力とプロセスを結び付けるファイルディスクリプタ
となります。
ファイルディスクリプタ 1
対象ファイルを「標準出力」から別のファイルに変更します。
ls 1> sample.txt
これはよく使われるため、
$ ls > sample.txt
と省略して記述できます。
ファイルディスクリプタ 2
対象ファイルを「標準エラー出力」から別のファイルに変更します。
$ ls dummydummydummy 2> sample.txt
ファイルディスクリプタ 1 と 2 (同時)
同時に変更することもできます。ログの保存の際に便利です。
$ ls . dummydummydummy 1> sample.txt 2> sample.txt
これは以下のように略記できます。
$ ls . dummydummydummy > sample.txt 2> sample.txt
更に略記できます。「&1」は「ファイルディスクリプタ1が対象とするファイル」を表しています。
$ ls . dummydummydummy > sample.txt 2>&1
応用例として、完全に出力内容を捨てるためには、
$ ls . dummydummydummy > /dev/null 2>&1
いわゆる/dev/nullにリダイレクトします。
ファイルへの追記
上書きではなく追記の場合、「n>」ではなく「n>>」とします。ここで、nはファイルディスクリプタの番号です。
$ ls >> sample.txt
「n>&m」はファイルディスクリプタmが追記であればファイルディスクリプタnも追記となり、上書きであれば上書きとなります。「n>>&m」とは記述できません。
ls . dummydummydummy >> sample.txt 2>&1
ファイル内容の消去
rmをするのではなくファイル内だけを消去したい場合、空の結果をそのファイルにリダイレクトして上書きします。
$ :> sample.txt
: は何もしないコマンドです。
UNIX / TypeScript / AWS / Go
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。





