TL;DR
bash
$ #実行すると標準出力と標準エラー出力に文字列を出す関数を作る
$ f() { echo "stdout"; echo "stderr" >&2; }
$ f
stdout
stderr
$
$ #リダイレクトに成功する場合、標準エラー出力が画面に出ることを確認
$ #つまり"stderr"が画面表示=コマンド実行されている
$ f > /tmp/f.log
stderr
$
$ #存在しないディレクトリのファイルにリダイレクトしてみる
$ #標準エラー出力が表示されない=コマンド自体が実行されていない
$ f > /tmp/hoge/fuga/f.log
-bash: /tmp/hoge/fuga/piyo.log: No such file or directory
$
$ #書き込めないディレクトリとして、tmpfsをReadOnlyマウントする
$ #標準エラー出力が表示されない=コマンド自体が実行されていない
$ mkdir -p /tmp/ro-tmpfs
$ sudo mount -t tmpfs -o ro tmpfs /tmp/ro-tmpfs
$ f > /tmp/ro-tmpfs/f.log
-bash: /tmp/ro-tmpfs/f.log: Read-only file system
備考
このときの終了ステータスは 1 になる。
環境
GNU bash, version 4.4.23(1)-release
日記
コマンドの実行時出力をファイルに残そうとしてハマった。
冷静に考えると当たり前の挙動だが、意外と悩んだ。