bash:$ @を中止するにはsu -cを実行してください。

bash:$ @を中止するにはsu -cを実行してください。

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

$

おすすめ記事