2017-09-25 109 views
1

我有這些功能在我的.bashrc中使用的功能(這是一個字符串PARAM):擊:如何在其他功能

# This function just untar a file: 
untar() 
{ 
    tar xvf $1 
} 

# This function execute a command with nohup (you can leave the terminal) and nice for a low priority on the cpu: 
nn() 
{ 
    nohup nice -n 15 "[email protected]" & 
} 

測試NN功能之前,我創建了一個焦油

echo test > test.txt 
tar cvf test.txt.tar test.txt 

現在我想做的是:

nn untar test.txt.tar 

但只有這樣工作的:

nn tar xvf test.txt.tar 

在這裏,錯誤的nohup.out:

nice: ‘untar’: No such file or directory 

回答

2

函數不是一等公民。 shell知道它們是什麼,但其他命令如find,xargsnice則不。要從另一個程序調用函數,需要(a)將其導出到子shell,(b)顯式調用子shell。

export -f untar 
nn bash -c 'untar test.txt.tar' 

,如果你想使它更容易爲呼叫者你可以自動完成:

nn() { 
    if [[ $(type -t "$1") == function ]]; then 
     export -f "$1" 
     set -- bash -c '"[email protected]"' bash "[email protected]" 
    fi 

    nohup nice -n 15 "[email protected]" & 
} 

這條線應該有自己的解釋:

set -- bash -c '"[email protected]"' bash "[email protected]" 
  1. set --更改當前函數的參數;它用一組新值替換"[email protected]"
  2. bash -c '"[email protected]"'是顯式的子shell調用。
  3. bash "[email protected]"是子外殼的參數。 bash$0(未使用)。外部現有參數"[email protected]"被傳遞給新的bash實例,如$1,$2等。這就是我們如何獲得子shell來執行函數調用。

讓我們看看如果您撥打nn untar test.txt.tar會發生什麼情況。 type -t檢查看到untar是一個函數。該功能已導出。然後setnn的參數從untar test.txt.tar更改爲bash -c '"[email protected]"' bash untar test.txt.tar