Bash バージョン: GNU bash、バージョン 4.1.2(1)-リリース(x86_64-redhat-linux-gnu)
これはうまくいきます:
#!/bin/bash
exec /usr/local/bin/python2.7 /app/add_container_host.py $@
しかし、特定のユーザーとして実行する必要があるため、次のように変更しました。
#!/bin/bash
su -c '/usr/local/bin/python2.7 /app/add_container_host.py $@' $USER
そして、Pythonスクリプトはもはやパラメータを取得しません。
一重引用符を二重引用符に変更してみました。これはPythonスクリプトの代わりに$@
独自に供給されます。su -c
$@
実行時にこれをPythonスクリプトに渡す方法はありますかsu -c
?
ベストアンサー1
問題はあなたが使用する引用です。の変数を拡張できるように二重引用符を使用する必要があります$@
。それ以外の場合はリテラルとして残り、拡張されません。
これは例です
$ cat runme.bash
#!/bin/bash
echo "run with double quotes"
su -c "echo $@" user1
echo "run with single quotes"
su -c 'echo $@' user1
$ ./runme.bash "a b c"
run with double quotes
a b c
run with single quotes
$
また、引数リストを引用符で囲まれたリストに渡す必要があります。そうしないと、コマンドはsu -c ...
混乱し、目的のユーザーに2番目の引数を解析しようとしますsu
。
他の例
$ ./runme.bash a b c
run with double quotes
su: user b does not exist
run with single quotes
$
デバッグのヒント
スクリプトが実際に実行する操作を表示するには、を切り替えて-x
実行できますbash
。
$ bash -x ./runme.bash a b c
+ echo 'run with double quotes'
run with double quotes
+ su -c 'echo a' b c user1
su: user b does not exist
+ echo 'run with single quotes'
run with single quotes
+ su -c 'echo $@' user1
$
引用された主張
$ bash -x ./runme.bash "a b c"
+ echo 'run with double quotes'
run with double quotes
+ su -c 'echo a b c' user1
a b c
+ echo 'run with single quotes'
run with single quotes
+ su -c 'echo $@' user1
$