シェルのリダイレクトのビット

によって2009年5月10日プラシャント · コメント
の下でファイルされる: 技術

ここでは、通常、シェルのリダイレクトを行う方法です。
$ ./pgm.sh args >out.txt 2>err.txt
私はそれを少し変更したいと次のように実行
$ ./pgm.sh args
出力とエラーは、argsに基づいてpgm.sh内で計算、いくつかのファイルに行く必要があることを要件と。 日付が引数の一部である場合、一つの例示のケースであるかもしれません。 ので、あなたの/ディレクトリ/ pgm_out_YYYYMMDD.txt /言いに行って標準出力(stdout)をご希望の1

リダイレクトするための標準的な方法で問題N>file.txtすなわち、ファイル記述子を関連付けるN File.txtには、それが現在のプロセスのために新たにforkしたプロセスとしない場合にのみ動作することです。
そう
$ echo hi 1>out.txt ; echo hii out.txtをハイに送信されますが、標準出力(stdout)にHIIが出力されます。 2

ここで、これはexec私たちの救助に来る。 我々が追加した場合exec 1>somefile.txtしてスクリプトの残りの部分からの出力はsomefile.txtに移動します

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$。/ test.shは、out.txtをするだけでなく、ハイテクHIIにリダイレクトされます

同様に、標準出力(stdout)と同様にstderrをリダイレクトするために我々はこのような何かをやる
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

現在のシェルの内側から、いくつかのファイルにリダイレクトするの原点に戻ってくると、プログラムはいくつかの変数OUTFILEでファイル名を計算言うみましょう、我々だけで行われたかもしれないexec 1>$OUTFILE

それは、現在の問題を解決します。 しかし、あなたはシェルスクリプトでファイルの "ランダムアクセス"を実現する次の例で通過するようなことがあります。 例からです。 ここで
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890

コメントで、このコードは自明です。
-
1はまた、によって行うことができます$ ./pgm.sh args >pgm_out`date +%Y%m%d`が、このアイディアはプログラム自体にいくつかのロジックに基づいて、このファイル名を生成することです。
2 1の1> out.txtを冗長ですが、それは我々がFD 1をリダイレクトしていることをここで明確に