このスクリプトを実行すると確かにwatch
画面に出力を表示し、確かに5秒後にタイムアウトが発生します。
§ cat script.sh
#!/bin/bash
timeout 5s watch -n 1 ps
スクリプトの実行時に画面に表示される内容は次のとおりです。
しかし、端末から直接スクリプトを実行すると、期待どおりに機能します。
§ timeout 5s watch -n 1 ps
スクリプトから呼び出すと、watch
コンテンツが画面に表示されなくなる正確に何が起こりますか?
また、スクリプトでオプションを使用すると、期待--foreground
どおりに機能しますが、なぜそうなのかわかりません。timeout
重要な場合、これらのツールのバージョンは次のとおりです。
§ bash --version
bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)
Copyright (C) 2007 Free Software Foundation, Inc.
§ watch -v
watch from procps-ng 3.3.12-dirty
§ timeout --version
timeout (GNU coreutils) 8.29
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Padraig Brady.
ベストアンサー1
timeout
シェルスクリプトで実行すると動作が異なります。この--foreground
オプションは、スクリプトで実行してもデフォルトの「対話型」動作を強制します。マンページから:
--foreground
when not running timeout directly from a shell prompt, allow COMMAND to
read from the TTY and get TTY signals; in this mode, children of
COMMAND will not be timed out
そして、watch
すべての素晴らしいANSIトリックを実行するには、端末に書き込みが必要です。
実際に機能している様子を確認するには、以下を試してください。
$ script -c 'timeout --foreground 5s watch -n 1 ps'
$ less typescript