Bashリダイレクトを理解しようとしています(3.6.リダイレクト)。私はテスト環境を準備し、リダイレクト作業の順序とファイル記述子の生成順序を理解しようとしました。
テスト環境の準備:
cd `mktemp -d`
mkdir no_access_dir
chmod 000 no_access_dir
ls -R
出力は次のとおりです。
.:
no_access_dir
ls: cannot open directory './no_access_dir': Permission denied
最初の2つのstdoutラインと1つのstderr出力が続きます。
3.6.2 Redirecting Output
以下を使用して3.6.4 Redirecting Standard Output and Standard Error
コマンドの動作を確認しました。3.6.8 Duplicating File Desciptors
3.6.9 Moving File Desciptors
テストコマンドは次のとおりです。
ls -R 2>&1 > a # 1. 3.6.2 or 3.6.8
ls -R 2>&1- > a # 2. 3.6.9
ls -R 1>&2 > a # 3. 3.6.2 or 3.6.8
ls -R 1>&2- > a # 4. 3.6.9
ls -R > a 2>&1 # 5. 3.6.4
ls -R > a 1>&2 # 6. 3.6.4
出力説明:
ls -R 2>&1 > a
- ファイルaに独自の内容が含まれており、エラーメッセージがありません。なぜですか?ls -R 2>&1- > a
- 上記と変わった点はありません。 - では、モバイルFDの意味は何ですか?ls -R 1>&2 > a
- それでも変わったことはないls -R 1>&2- > a
- エラーメッセージは表示されず、エラーメッセージはファイルに表示されません。ls -R > a 2>&1
- 両方のストリームがファイルにリダイレクトされます。期待どおりに動作します。ls -R > a 1>&2
- stdoutがstdoutにリダイレクトされるため、ファイルaは空です。
5
私はとの出力を理解しています6
が、なぜコマンドで1
出力2
が3
同じで、なぜnumberが4
エラーメッセージを表示しないのか、このメッセージをファイルに保存しないのかは謎です。
だから私の質問は次のようになります
[n]>word
出力リダイレクトとfdコピーの違いは何ですか[n]>&digit
?どちらを使用しますか?2>&1
1
出力ファイルにエラーメッセージが含まれていないのはなぜですか2
? stderrストリームがstdoutにリダイレクトされました。- モバイルFDのユースケースは何ですか?
- エラーメッセージはどこで発生しますか
4
?出力ファイルまたはコンソールにありません。
私の現在の理解は次のとおりです。
ls -R > a 2>&1
- まず、Bashがファイルを作成し、新しく作成したファイルを検索するa
コマンドを実行し、ファイルにリダイレクトして保存するメッセージを表示します。しかし、この場合、構文は非常に不明です。ls -R
a
stderr
stdout
答え1
問題はタイミングです。リダイレクトが発生すると順番に適用されるため、コマンドライン上の場所が重要です。したがって、ポイント1-4の場合、後で来るかどうかは重要ではありません> a
。最終的に到達した場合にのみ適用されます。完了したすべてのタスクは&2
以前に発生したため、そのポイントにリダイレクトする> a
と、&1
まだ以前のタスク、つまりターミナル出力を参照します。