スクリプトを直接呼び出すのではなく、なぜスーパーバイザーで `bash -c`を使用するのですか?


11

supervisordサーバーのサービスを制御するために使用し始めています。私はLinuxのプロユーザーではありませんが、Linuxをうまく使いこなすことができます。

好奇心から、supervisordのほとんどのコマンドが次のように呼び出されているように見えることに気づきました。

[program:install]
command=bash -c "/src/etc/install.sh"

私はbashの人を読みました、そしてそれ-cが文字列の後に渡された変数を挿入するために使用されるべきであることを知っています。

ではbash -c、スクリプトを直接呼び出すのではなく(下の例のように)、スーパーバイザー(またはその他の場所)で使用するポイントは何ですか?

[program:install]
command=/src/etc/install.sh

ありがとう!

回答:


11

シェルはパス名展開(などの機能*?)、コマンドリスト(;&&||()、リダイレクション<>|、)のみが引数文字列の配列にコマンドを分割することsupervisordによって実装されていません。

これbash -cは、コマンドでそのような機能を使用したいと思うかもしれない初心者ユーザーのための単なる助けになるかもしれません。たとえば、それは驚きを避けます

command=echo foo > /tmp/bar

foo > /tmp/barに書き込む代わりに出力foo/tmp/barます。

-c変数とはほとんど関係ありません。bashのための追加の引数は、スクリプトのみの引数として利用可能になり$0$1コマンドで、などが、その機能はほとんどすべての用途を持っていません。たとえば、bash -c 'echo $0 $0' foo出力foo foo


1
おかげで、それは非常に実用的な答えでした、そしてそれはおそらく私に多くの時間を節約するでしょう。私は、初心者ユーザーとしてこの間違いを犯します(そしてbash -c、解決策とは考えません!)。
Daniel Costa

6

それはドキュメントで説明されています

サブプロセスの実行時に監視プログラムによってシェルが実行されることはないため、USER、PATH、HOME、SHELL、LOGNAMEなどの環境変数は、デフォルトから変更されたり、別の方法で再割り当てされたりすることはありません。これは、構成でuser =スタンザを使用してスーパーバイザー実行からプログラムをrootとして実行する場合に特に注意する必要があります。

この問題を回避するためbash -cに使用されることがあります。


2
マーク、あなたの答えに感謝しますが、もう1つはもっともっともらしいシナリオだったと思います(あなたにとって私にとって不正確ではありませんが、正しい答えを1つ選ぶ必要があります。)。その上、私はまた、より少ないポイントで新しいユーザーを助けています。
Daniel Costa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.