systemdを介してサブシェルをコマンドライン引数として使用してシェルスクリプトを実行する方法

systemdを介してサブシェルをコマンドライン引数として使用してシェルスクリプトを実行する方法

他のシェルスクリプトの出力として表示されるコマンドライン引数を受け入れるシェルスクリプトがあります。つまり:

myscript1.sh -opt `myscript2.sh` 

systemdを介してこのスクリプトを起動する必要があります。

.serviceファイルにこのディレクティブを追加してみました。

...
[Service]
...
ExecStart=/bin/bash -c "myscript1.sh -opt `myscript2.sh`"
...

そして、ソリューションは実際に動作します。

myscript1.sh私の質問は:コマンドを使わずにスクリプトを直接起動できますか/bin/bash

答え1

ドキュメントから始めてください。man systemd.service

ExecStart=このサービスを開始したときに実行するパラメーターを含むコマンド。値は、以下の規則に従ってゼロ個以上のコマンドラインに分割されます(以下の「コマンドライン」セクションを参照)。

その後、相互参照に従ってください。

コマンドラインこのセクションでは、ExecStart=[...and other...]オプションのコマンドライン解析と変数と指定子の置換について説明します。

複数のコマンドラインをセミコロンで区切って単一のコマンドにリンクできます。これらのセミコロンは別の単語として渡されるべきです。単一のセミコロンは「;」でエスケープできます。

[… ]

この構文はシェル構文に触発されました。ただし、次の段落で説明されているメタ文字と拡張のみを理解しています。変数の拡張は異なります。特に、および<、使用されたパイプ、使用されたデーモン、およびその他のシェル構文要素を使用したリダイレクトはサポートされません。<<>>>|&

ExecStart=したがって、このオプションはシェルによって解析されるのではなく、非常に制限されたシェルコードサブセットを実装するプロセスによって解析されることは明らかです。

私はより単純なシェルとバックティックをより現代的に置き換えるコードを変形して使用します。

ExecStart=/bin/sh -c 'myscript1.sh -opt $(myscript2.sh)'

関連情報