パラメータによってメソッドに提供されるコマンドを実行するbashスクリプトで関数メソッドを作成しようとしています。
このような意味:
special_execute()
{
# Some code
# Here's the point where the command gets executed
$@
# More code
}
special_execute echo "abc"
私はすでに試しました$@
、"$@"
、$*
、"$*"
どうすればよいですか。
関数に引数を渡すとき、それは引用問題だと思います。
次のように呼び出してみてください:
$ 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