Bash
如何強製手表在 bash 下執行
問題是當 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
使用-x
or指示執行您的 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!