web-dev-qa-db-ja.com

関数パラメーターによって提供されるコマンドを実行する

パラメータによってメソッドに提供されるコマンドを実行するbashスクリプトで関数メソッドを作成しようとしています。

このような意味:

special_execute()
{
    # Some code

    # Here's the point where the command gets executed
    $@

    # More code
}

special_execute echo "abc"

私はすでに試しました$@"$@"$*"$*"どうすればよいですか。

17
BrainStone

関数に引数を渡すとき、それは引用問題だと思います。

次のように呼び出してみてください:

$ special_execute "echo 'abc'"
'abc'

abcを一重引用符で囲まないようにするには、次のように引用符を変更します。

$ special_execute "echo abc"
abc

デバッグ中

関数の内部をラップして、より詳細にエコーすることができます。

$ function special_execute() { set -x; "$@"; set +x; }

次に、関数special_executeを使用してコマンドを実行すると、何が起こっているかを確認できます。

psの例:

$ special_execute ps -eaf
+ ps -eaf
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Aug21 ?        00:00:01 /sbin/init
root         2     0  0 Aug21 ?        00:00:00 [kthreadd]
...

Perlの例:

$ special_execute Perl -MTime::HiRes=sleep -le 'for(1..10) { print; sleep 0.05; }'
+ Perl -MTime::HiRes=sleep -le 'for(1..10) { print; sleep 0.05; }'
1
2
3
4
5
6
7
8
9
10
+ set +x

解析引数$1

このようにして、$1として渡された引数を解析できます。

$ function special_execute() { 
    [ "$1" -eq "-123" ] && echo "flagY" || echo "flagN"; 
    shift; 
    set -x; "$@"; set +x; 
  }

デバッグを有効にして:

$ special_execute -123 Perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagY
+ Perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
1
2
3
4
5
+ set +x

デバッグをオフにして--123

$ special_execute -123 Perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagY
1
2
3
4
5

デバッグをオフにして--456

$ special_execute -456 Perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagN
1
2
3
4
5
11
slm