「下記ファイルディスクリプタがプロセスと結びつける対象ファイル」を別のファイルに変更することをリダイレクションとよびます。実際には、ファイルディスクリプタ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
:
は何もしないコマンドです。
関連記事
- シェルスクリプトにおける数値計算シェル変数はすべて文字列扱いであるため、数値計算のためには専用のコマンドを用いる必要があります。 整数同士の計算 整数同士の四則演算にはexprコマンドを使用します。 sample.sh #!/bin/sh expr 1 + 1 expr 1 - 1 expr 1 '*' 1 # ワイルドカードと区別するために、クォーテーションで囲う必要があります expr 1 / 1 expr 1 % 1 実行...
- egrepとgrepの違いgrepは 'g'lobal 'r'egular 'e'xpression 'p'rint つまり、全体から正規表現で一致したものを抽出するためのコマンドです。egrepは 'e'xtended grep つまりgrepの機能拡張版です。拡張正規表現とよばれる式が使用できるため、grepと比較して高度な抽出が可能になります。とはいえ、grepに'-E'オプションを付与して実行するとegrepとほぼ...
- シェルスクリプトにおける関数定義シェル関数は複数のコマンドをひとまとめにしたものです。引数の取得では、シェルスクリプトの引数と同じ名称の特殊変数を使用します。また、独自のローカル変数を用意することができないため、関数外で使用されている変数の内容を書き換えてしまう危険性があります。 シェル関数は複数のコマンドをまとめたもの sample.sh #!/bin/sh echo1(){ echo 1 } echo1 実行例 $ ...
- シェルスクリプトでシグナルをキャッチする無限ループに陥ってしまったプロセスを強制終了させるためにはCtrl-Cやkillコマンドを利用します。このとき、プロセスにはシグナルというものが送られています。プロセスはシグナルの種類に応じて既定された処理を実行します。trapコマンドを用いると、各シグナル番号に対応する既定の処理を書き換えることができます。 trapコマンド シグナルN1, N2, N3, ...を受けたときに実行するコマンドを...
- シェルスクリプトにおける反復処理for sample.sh #!/bin/sh for i in a b c; do echo $i done ARR=( "abc" "xyz" ) for e in "${ARR[@]}"; do echo $e done 実行例 $ ./sample.sh a b c abc xyz while sample.sh #!/bin/sh cnt=1 while ...