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


15

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

次のような意味:

special_execute()
{
    # Some code

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

    # More code
}

special_execute echo "abc"

私はすでに私が試した$@"$@"$*"$*"私はそれをどのように行うことができますか?


$@私のために働くspecial() { $@; }.... ... special echo "foo"与えるfoo
Drav Sloan

:それはで私のために動作しませんでしたperl -MTime::HiRes=sleep -le 'for(1..100) { print; sleep 0.05; }'し、tar -cvf "backups/test.tar" -P "backups/uncompressed_server_backup_(DO NOT TOUCH!)/server/"
BrainStone

3
引用符を使用"$@"すると、より多くの成功が得られます:)
Drav Sloan

OK。今では動作します。実際の呼び出しの周りのコードを台無しにしたようです。
ブレインストーン

問題ありません、私たちはすべてそれらの瞬間を持っています:)
Drav Sloan

回答:


10

関数に引数を渡すときの引用の問題だと思います。

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

$ 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

エイリアスを使用しているときに「コマンドが見つかりません」というエラーが表示されるのはなぜですか?
エリーG.

@DrunkenPoney-そのようなcmdはありませんalias
slm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.