問題は、ウォッチを実行すると実行され、sh
このエラーが発生することです:
sh: 1: func1: not found
コードは次のとおりです。
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
問題は、ウォッチを実行すると実行され、sh
このエラーが発生することです:
sh: 1: func1: not found
コードは次のとおりです。
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
回答:
さて、あなたのアプローチにはいくつかの問題があります。
シェル間で移植できない関数をエクスポートしています。watch
はコマンドを実行しますが/bin/sh
、システムではそうではありませんbash
。そして、どんなシェルであっても、関数のエクスポートを尊重しないため、エラーが発生します。
次に、コマンドをのようなものに変更できますwatch bash -c 'func1'
が、これもうまく機能しない可能性があります。
ここでの理由は、スクリプトで設定された変数が関数で使用できないためです。必要なものをエクスポートできるかもしれませんが、それは面倒になり始めます。
最も安全な解決策はfunc1
、スクリプトを単独で入れて、そのスクリプトを呼び出すことです。
要するに、試してみてください:
watch bash -c func1
.bash_profile
.bash_profile
ファイルが比較的空の環境で物事を監視するための優れたコマンドです。ただし、.bash_aliases
ファイル内にある(myをソースとする.bashrc
)エイリアスを実行したいので-i
、bashにもフラグを追加することになりました。私はそれが誰かを助けるかもしれないと思った:watch bash -ic "func1; alias1; func2; …"
watch -x bash -c my-func
Ubuntu Server 16.04でのみ機能しますが、他の機能は動作しません。
のデフォルトのシェルはwatch
です/bin/sh
。シェルは、他のタイプのシェルからエクスポートされた変数または関数を継承しません。
お使いのシステムがシンボリックリンクしていない場合/bin/sh
に/bin/bash
(またはあなたの現在のシェル)あなたが指示することができますwatch
使用して、シェルをexecしします-x
か--exec
:
watch -x bash -c "my_func"
または
watch --exec bash -c "my_func"
これはwatch bash -c "test_watch"
(を除く--exec
)とは異なり/bin/sh
、子プロセス(この場合はbash
)を生成するために使用せずbash
、ずっと下に維持します。他の回答で指摘されているように、現在の環境に高度に結合された関数をエクスポートする場合(つまり、他の変数または関数が必要な場合)、これは面倒になります。
例:
test_watch() { echo 'Working!'; }
export -f test_watch
watch --exec bash -c "test_watch"
おなじみの
Every 2.0s: bash -c test_watch Thu Mar 31 11:15:56 2016
Working!
watch -x bash -c my-func
のUbuntu Serverの16.04で私のためにそう、この作品-他の人がいない間。トンありがとう!