「watch」コマンドでbash機能を実行するには?

「watch」コマンドでbash機能を実行するには?

bashrcに関数fを定義するとしましょう。

function f() {
  date
}

出力を監視するには、次のコマンドを実行したいと思います watch f。コマンドが失敗し、sh:f: コマンドが見つかりませんwatch bash -c f同じ結果が出てきます。

このwatchコマンドが期待どおりに機能するようにするにはどうすればよいですか?

答え1

watch時間間隔ごとに新しいプログラムを開始する外部プログラム。

あなたの場合、sh起動されたデフォルトのシェルまたは明示的に起動されたシェルは機能bashについて知らず、f渡されません。

実行する項目に関数定義を含めることができます。たとえば、次のように書くことができます。

#!/bin/bash
function f() {
  date
}
f

テキストファイル「myscript.sh」を作成して実行可能にしてから使用してくださいwatch ./myscript.sh

または、次のことができます。

function f () {
}
typeset -fx f
#   ^---------- modify the type of a name
#        ^----- work only on functions
#         ^---- export to environment
watch -x bash -c "f"
#     ^-------- use `exec` rather than `system` to start bash;
#               makes no sense to start a shell from a shell you
#               only start to start a shell (but omitting -x has
#               no downside other than launching an unnecessary
#               middle layer of `sh`)

watch子プロセスは環境変数を継承するため、bashが起動時に認識できるように、関数宣言を環境変数にエクスポートします。

スクリプトオプションを使用することをお勧めします。あまり複雑で環境を乱すことはありませんが、これは驚くべき副作用を引き起こす可能性があります。パフォーマンス上の利点はありません。どちらの場合も、シェルは新しいサブシェルで関数宣言のソースコードを解析します。

最後に、次のことなく行うことができますwatch

while true ; do
  tput clear # to clear the screen
  f
  sleep 1
done

tput clearスクロールバッファがクリアされます。以前のコンテンツがある場合は、まず保存することをお勧めします。

関連情報