2017-09-25 18 views
1

を(文字列paramです)機能を使用するには:バッシュ:私は私の.bashrcにこれらの機能を持っているか、他の機能に

# 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の機能をテストする前に、私はタールを作成します。

nn untar test.txt.tar 

しかし、これだけでは動作します:

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

今、私が何をしたいです

nn tar xvf test.txt.tar 

ここnohup.outでエラー:

nice: ‘untar’: No such file or directory 

答えて

2

機能は、ファーストクラスの市民ではありません。シェルは、それらが何であるかを知っていますが、find,xargs、およびniceのような他のコマンドはありません。他のプログラムから関数を呼び出すには、(a)それをサブシェルにエクスポートし、(b)サブシェルを明示的に呼び出す必要があります。

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]"'は明示的なサブシェル呼び出しです。
  3. bash "[email protected]"は、サブシェルの引数です。 bash$0(未使用)です。既存の外側の引数"[email protected]"は、新しいbashインスタンスに$1,$2などとして渡されます。これは、関数呼び出しを実行するためのサブシェルの取得方法です。

nn untar test.txt.tarに電話するとどうなりますか。 type -tチェックでは、untarが関数であるとみなされます。関数がエクスポートされます。その後、setは、nnの引数をuntar test.txt.tarからbash -c '"[email protected]"' bash untar test.txt.tarに変更します。

関連する問題