2009-12-11 40 views
78

請告訴我如何導出父shell(bash中,sh或ksh),這樣的功能將可以從父進程launced所有的子進程的功能?導出殼的功能

+0

http://unix.stackexchange.com:

func="$(typeset -f funcname)" export func 

要導入的功能,從出口字符串重新定義它/ questions/22796/can-i-export-functions-in-bash – 2015-08-23 10:07:50

回答

91

export -f功能是專門針對擊:

#!/bin/bash 
plus1() { echo $(($1 + 1)); } 
echo $(plus1 8) 
export -f plus1 
./child 14 21 

孩子

#!/bin/bash 
echo $(plus1 $(($1 * $2))) 
+2

是導出函數僅適用於子調用?如何將它應用到當前的bash會話?就像.bashrc寫入一樣,但僅限於當前的bash實例... – 2014-05-03 15:37:35

+2

@vp_arth:如果您在子調用中不需要該函數,則不需要導出它。它可以在當前會話中以任何方式使用(請注意,如果它是在文件中定義的,則需要獲取文件的源代碼,而不是運行它以使其在當前會話中可用)。 – 2014-05-03 16:04:58

1

如果創建()子shell那麼他們將繼承所有的定義,參數和shell變量的快照。

如果執行他們喜歡的程序,那麼你可以把定義中.bashrc

如果您試圖將現有腳本僞裝成執行包裝器或替換PATH命令,則.bashrc將根據執行的細節工作。如果沒有,你可以改爲執行一個包裝腳本,只是做了.或定義的函數,然後不帶命令的shell腳本,同樣的事情被取代的包含文件的source

這個腳本可能看起來像:

script=$1 
shift 
. include.sh 
. $script "[email protected]" 

的想法是,第一個參數是真正的腳本的名稱和其餘參數是指定參數時,那麼上面的腳本改爲運行。

+2

您能否用一些編碼示例來解釋這些問題。我不想把我的功能放在.bashrc中 – 2009-12-11 05:36:46

3

如果您正在使用KSH或zsh中:

可以使用環境變量FPATH,其中您可以放置​​所有功能。

如果FPATH設置在交互式解釋,並命令或功能並沒有在當前shell環境中發現或PATH,目錄中所列有搜索的失蹤命令後命名的文件的存在。如果找到了它,它將在當前的shell環境中進行採購,並期望定義該功能。

所以,你可以將所有的功能於一身的位置FPATH,和兒童腳本也將能夠找到它。

您可以在shell腳本中使用autoload命令加載您所需要的功能:

autoload fun_a fun_b 

在zsh中,爲FPATH工作autoload是必需的。ksh及其近親屬,我相信這只是導致FPATH定義在你的PATH覆蓋常規命令的功能,因爲他們如果直接定義。

FPATH和一些細節autoload

1
declare -x -f NAME 

更多信息

 
-f  restrict action or display to function names and definitions 
-x  to make NAMEs export 
+4

請注意,這是**特定於'bash' **。 (''ksh'對應'declare','typeset',具有'-x'選項,但它只適用於_variables_,而不是函數;同樣適用於'zsh')。 – mklement0 2014-11-09 23:15:22

0

功能本質上不可導出。然而,你可以導出字符串,所以我有一個小竅門在這裏:

# in subshell 
eval "$func"