スクリプトがタイムアウトで呼び出すときに時計が画面に何も表示されないのはなぜですか?

スクリプトがタイムアウトで呼び出すときに時計が画面に何も表示されないのはなぜですか?

このスクリプトを実行すると確かに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

おすすめ記事