$ time (exec -a foo echo hello)
hello
stderr
(time
その出力を書き込む場所) がどこかに漏れているようです。明らかにこれは私が意図したものではありません。
私の質問は、「サブシェルが別のプログラムを実行するときに、標準エラーストリームが端末に書き込まれないのはなぜですか?」という一般的な言葉で表現できます。
いくつかのメモ:
- プロセスのゼロ番目の引数を変更するスイッチに使用
exec
する必要があります。-a
これを行うための代替手段をいただければ幸いexec
ですが、何も知りません。今、この動作に興味を持ちました。 - もちろん、スクリプトを続行したいので、サブシェルが必要です。繰り返しますが、代替案は大歓迎です。
exec
サブシェルで行うことは良いことですか? time
一般に、サブシェルを実行すると問題なく動作するため、実際にはexec
.
誰かが私を正しい方向に向けることができますか? 参考資料のどこから始めればよいかわかりませんexec
。説明はかなり簡潔です。
更新:time
実際、ここに bash が組み込まれているのは 「幸運」でした。/usr/bin/time
他のプロセスと一緒に、または他のプロセスとまったく解析しません。
$ env (exec -a foo echo hello)
bash: syntax error near unexpected token `exec'
実際、これは理にかなっています。サブシェルを引数として渡すことはできません。これを他の方法で行う方法はありますか?
更新: 要約すると、ここには 4 つの適切な回答があります。すべてが異なり、何かが欠けている可能性があります。
time
bash がデフォルトで通常使用する実際のファイルシステム リンク (ハードまたはシンボリック) を使用します。hek2mgl のクレジット。ln $(which echo) foo && time ./foo hello && rm foo
fork
time
bash を使用exec
し、特別な構文を使用せずに bash サブシェルを使用する場合。time bash -c 'exec -a foo echo hello'
fork
time
bashをexec
使用するが小さなラッパーを使用する場合。time launch -a foo echo hello
fork
および特別な構文で bash を使用する場合exec
。time
sjnarv のクレジット。time { (exec -a foo echo hello); }
タイマーが「プロキシ」プログラムでカウントする必要がないため、ソリューション1の影響は少ないと思いますが、あまり実用的ではなく(多くのファイルシステムリンク)、技術的にも理想的ではありません。1 回目はプロキシ プログラム (2 と 4の場合はサブシェル、3 の場合はラッパー) をロードし、もう 1 回は実際のプログラムをロードします。これは、が秒をカウントすることを意味します。非常に安価になる可能性がありますが、実際にはファイルシステムのルックアップを実行しますが、これはかなり遅くなる可能性があります (特に、それ自体を使用して検索する場合、またはプロキシプロセスが検索する場合)。time
exec
exec
time
exec
exec
PATH
exec*p
したがって、唯一のクリーンな方法 (この質問の回答がカバーする限り) は、bash にパッチを適用してtime
キーワードを変更しexec
、0 番目の引数をゼロ以外の値に設定できるようにすることです。おそらく のようになりますtime -a foo echo hello
。