リダイレクション (UNIX)
[履歴] [最終更新] (2013/08/08 08:47:22)
最近の投稿
注目の記事

概要

「下記ファイルディスクリプタがプロセスと結びつける対象ファイル」を別のファイルに変更することをリダイレクションとよびます。実際には、ファイルディスクリプタ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

':'は何もしないコマンドです。

関連ページ
    やりたいこと hello.sh #!/bin/sh while : do date sleep 1 done ローカルホストにおけるバックグラウンド処理はコマンドの後に '&' を付与することで実現できます。リダイレクションについてはこちらをご参照ください。 ./hello.sh > out.txt 2>&1 & tailf out.txt 2015年 6月 15日
    ファイル内容を再帰的に検索 (grep) find コマンドはファイル名についてディレクトリを再帰的に検索します。ファイルの内容について指定したディレクトリ以下を再帰的に検索するためには grep に -r オプションを付与します。その際 -n および -i オプションも付与しておくと便利です。未来創発 NRI grep です。
    概要 ファイル記述子 (File Descriptor) に関連するシステムコールを利用した C 言語のサンプルコードを記載します。 ファイルの読み書き open/close main.c #include <unistd.h> #include <fcntl.h> #include <stdio.h> int main() { int fd_r, fd_w; // 読