リダイレクトが失敗した場合、Bashプログラムは実行されません。

リダイレクトが失敗した場合、Bashプログラムは実行されません。

Bashでリダイレクトを使用するコマンドが失敗すると、そのコマンドの前に実行されていたすべてのプログラムが実行されていないことがわかりました。

たとえば、プログラムは「a」ファイルを開き、「a」ファイルに50バイトを書き込みます。ただし、このコマンドを実行して権限のないファイル(〜root / log)にリダイレクトしても、「a」のファイルサイズは変わりません。

$ ./write_file.py >> ~root/log
-bash: /var/root/log: Permission denied
cdal at Mac in ~/experimental/unix_write
$ ls -lt
total 16
-rw-rw-r--  1 cdal  staff  0 Apr 27 08:54 a <-- SHOULD BE 50 BYTES

プログラムが実行され、出力をキャプチャしてから(ファイル「a」にも書き込む)、~root / logに出力を書き込めないと考えることができます。代わりにプログラムは実行されません。

なぜこれが起こるのですか? bashは、プログラムを実行する前に「検査」が実行される順序をどのように選択しますか?他のテストも行われますか?

ps。 「権限の拒否」ファイルにリダイレクトされると、cronで実行されているプログラムが実際に実行されていることを確認したいと思います。

ベストアンサー1

これは実際にはチェック順序の問題ではなく、単にシェル設定の順序に関する問題です。リダイレクトは、コマンドが実行される~root/log前に設定されます。したがって、ログファイルを開くことができないため、例ではシェルは./write_file.pyコマンドライン処理を停止します。

これを実証する1つの方法は、実行不可能なファイルをインポートして実行することです。

$ touch demo
$ ./demo
zsh: permission denied: ./demo
$ ./demo > ~root/log
zsh: permission denied: /root/log

これは、シェルが./demoリダイレクトを設定できない場合も考慮しないことを示しています。

おすすめ記事