ウォッチをbashの下で強制的に実行する方法


18

問題は、ウォッチを実行すると実行され、shこのエラーが発生することです:

sh: 1: func1: not found

コードは次のとおりです。

#!/bin/bash

func1(){
  echo $1
}

export -f func1

watch func1

実際に実行するコマンドを教えてもらえますか?
cuonglm

代わりにエコー$ 1の@Gnoucは、私は少し長いスクリプトを持っている私は知らないので...
ラシッドOussanaa

どうやってsshコマンドを実行したのですか?
cuonglm 14

@Gnouc ./bin/myfunc.sh
Rachid Oussanaa 14

回答:


10

さて、あなたのアプローチにはいくつかの問題があります。

シェル間で移植できない関数をエクスポートしています。watchはコマンドを実行しますが/bin/sh、システムではそうではありませんbash。そして、どんなシェルであっても、関数のエクスポートを尊重しないため、エラーが発生します。

次に、コマンドをのようなものに変更できますwatch bash -c 'func1'が、これもうまく機能しない可能性があります。
ここでの理由は、スクリプトで設定された変数が関数で使用できないためです。必要なものをエクスポートできるかもしれませんが、それは面倒になり始めます。

最も安全な解決策はfunc1、スクリプトを単独で入れて、そのスクリプトを呼び出すことです。
 

要するに、試してみてください:

watch bash -c func1

1
関数が.bash_profile
-VarunAgw

@VarunAgw、それは良い点です。ただし、.bash_profileファイルが比較的空の環境で物事を監視するための優れたコマンドです。ただし、.bash_aliasesファイル内にある(myをソースとする.bashrc)エイリアスを実行したいので-i、bashにもフラグを追加することになりました。私はそれが誰かを助けるかもしれないと思った:watch bash -ic "func1; alias1; func2; …"
aaiezza

watch -x bash -c my-funcUbuntu Server 16.04でのみ機能しますが、他の機能は動作しません。
ナムG VU

14

のデフォルトのシェルは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で私のためにそう、この作品-他の人がいない間。トンありがとう!
ナムG VU

4

watchスクリプト内から実行する理由 なぜこのシェルスクリプトを持っていないのですか:

$ cat func1 
#!/bin/bash

func1(){
  echo $1
}

func1 $1

...そして、次のように実行します...

$ watch func1 foo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.