ポイントは何ですか1<filename
?たぶん「キーボード - >標準出力」を意味しますか?
答え1
1<filename
filename
読み取り用にファイルを開き、ファイル記述子1で実行されているコマンド(またはリダイレクトを使用している場合はフルシェルプロセス)でそのファイルを使用できるようにシェルに指示するリダイレクトexec
。これは通常、すべてのリダイレクトに適用されるためです。<
入力リダイレクトを表示するために、オプションの先行番号はファイル記述子番号を指定します。
このリダイレクトで珍しいことは、fd 1が標準出力ストリーム用に予約されているため、プログラムは通常ここに書き込むことができると仮定していることです。入力リダイレクトで開くと、この仮定は失敗します。
$ touch filename
$ ls 1<filename
ls: write error: Bad file descriptor
入力用にfd 2(stderr)を開くか、入力用にfd 0(stdin)を開くと同じことが起こります。出力。
$ cat 0> filename
cat: -: Bad file descriptor
もちろん、stderrに書き込めない場合、エラーメッセージは表示されません。ゼロ以外の偽の終了ステータスが表示されることがあります。
答え2
標準出力で入力ファイルを開かないでください。 (exec
リダイレクトする前に機能する必要がありますが、それでも失敗してブロックされる可能性があります。)fdでファイルを開くには、3または3を使用してください。
exec 3<filename
# do something with fd 3
exec 3<&-
fd 0(stdin)にリダイレクトすることは可能ですが、fd 0が別の場所を指している場合は、最初に保存する必要があります。
exec 3<&0
exec < filename
# do something with the file on fd 0
# restore stdin, free fd3
exec 0<&3 3<&-