你的問題問大約只有導出功能。這在bash中很容易,見下文。
你的問題的標題/主題暗示在xargs中使用函數,就好像它們是一個腳本; 我不知道xargs可以直接「調用」bash函數,但是您當然也可以在xargs
所調用的腳本中使用導出的函數 ,如下所示。
首先,列出函數的函數。在默認情況下並-v用戶功能列出所有功能:
lsfns() {
case "$1" in
-v | v*)
# verbose:
set | grep '()' --color=always
;;
*)⋅
declare -F | cut -d" " -f3 | egrep -v "^_"
;;
esac
}
下一頁的功能導出所有用戶的功能:
exportfns() { export -f $(lsfns); }
或只是把export -f $(lsfns)
你.bashrc
。
例腳本doit.sh:(chmod a+rx doit.sh
後)
#!/bin/bash
lsfns "[email protected]" # make use of function exported by parent shell :)
實施例的命令行:
echo -v | xargs doit.sh
與
echo "" | xargs doit.sh
EDIT 1比較:進一步響應於kdb的評論/答案be低(「遇到導出函數根本不起作用的情況):
shell函數的導出不是Posix兼容的 - 即它只適用於Bash,可能還有其他的shell,比如Zsh,Ksh等。
也就是說,在Dash和「標準」Posix shell中沒有提供「export -f」,我們不能導出函數,並且如果我們在Bash中導出一個函數,然後運行一個以sh-bang開頭的腳本例如「#!/ bin/dash」,該腳本將無法使用父shell中的「導出」函數,因爲由Bash導出到「進程環境」的函數不會被Dash識別。
編輯2:進一步響應OP評論「但如果myfunction
取決於其他功能這變得難以維持」:
這可能是一種情況,人們可以好好利用殼source
的命令(別名「。」),例如:
. ~/etc/my-functions.sh; myMain ...
而且類似地,如果你「活」在功能而不是腳本文件中,比如當你需要的時候通過調用myMain
,那麼這個函數的第一行就可以來源你的函數庫;
,因爲這將是在「定期運行一個腳本」的情況下多餘的開銷,myMain
成爲命令行存根功能,(重新)加載你的函數庫,並調用actuallyDoit
功能(這也可以從被稱爲在你的腳本里面,如果你有一個腳本文件)。
享受
Zenaan
其實我的問題包含一個使用xargs的例子,所以我沒有看到第二段的含義。我讚賞其餘的答案('exportfns'會有幫助)。 – kdb
我正在爲未來的讀者澄清,以防有人試圖直接使用xargs「調用」一個函數,將該函數視爲腳本來處理,例如'find dir/| xargs aBashFn'不能工作 - 你必須將這個函數包裝在腳本中,或者像你的第一個例子那樣,產生一個bash子shell - 但是fork bash調用一個函數的方式非常繁重,除非你只需要它一次。我希望這解釋了爲什麼我寫這個... – zenaan