Bash

如何強製手表在 bash 下執行

  • March 31, 2016

問題是當 watch 被執行時它執行sh並且我得到這個錯誤:

sh: 1: func1: not found

這是程式碼:

#!/bin/bash

func1(){
 echo $1
}

export -f func1

watch func1

好的,所以您的方法存在一些問題。

您正在導出一個不能在 shell 之間移植的函式。watch使用 執行其命令/bin/sh,而在您的系統上不是bash. 不管它是什麼外殼,它都不尊重函式導出,所以你會得到錯誤。

其次,您可以將命令更改為類似的命令watch bash -c 'func1',但這也可能效果不佳。

這裡的原因是腳本設置的任何變數對函式都不可用。您也許可以導出它需要的那些,但這開始變得混亂。

最安全的解決方案是自己放入func1一個腳本並呼叫該腳本。

 

簡而言之,嘗試:

watch bash -c func1

的預設外殼watch/bin/sh. Shell 不會從其他類型的 Shell 繼承導出的變數或函式。

如果您的系統沒有符號連結/bin/sh/bin/bash(或您目前的 shell),那麼您可以watch使用-xor指示執行您的 shell --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!

引用自:https://unix.stackexchange.com/questions/144346