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

2009年5月10日でプラシャント · コメント
報告Filed under: 技術

ここではどのように我々は通常、シェルのリダイレクトを行うことです
$ ./pgm.sh args >out.txt 2>err.txt
私はビットと実行、それを変更したい以下のとおり
$ ./pgm.sh args
要件は、出力とエラーがいくつかのファイルに行く必要がで内部引数に基づいてpgm.sh計算されます。 1つの例示の場合は、日付はargsの一部であるかもしれない。 だから、pgm_out_YYYYMMDD.txtを/とディレクトリ/あなた/希望stdoutをに行くと言っ1

のリダイレクト方法で標準的な問題は、N N>file.txtを、file.txtは記述Nをファイルに関連付ける、プロセスが、現在新たに動作のみforkしたプロセスではなく、です。
そう
$ echo hi 1>out.txt ; echo hii out.txtになるハイテク送信がstdoutに斐伊川印刷されます。 2

ここではexec救助たちだし。 追加する場合は私たちがexec 1>somefile.txtしsomefile.txtに行くスクリプトの残りの部分からの出力を

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

リダイレクト標準同様と同様に我々はこのような何かをやる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を聞かせて変数のいくつかのファイル名をで言うプログラムが計算、我々が行うだけでしたhave幹部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 out.txt 1>冗長ですが、それがここに明らかに、我々は1 fdがリダイレクトされます