Ubuntu:Makefileでターミナル出力を実行する

Ubuntu:Makefileでターミナル出力を実行する

他のコマンドの出力として機能するコマンドがあります。この出力をmakefileスクリプトで実行したいと思います。

再現できるより簡単なコマンドは次のとおりです。

awsecrpush:
    VAR=$$( sudo echo "ls -lah" ) | bash -c "sudo -s $$VAR"

私の結果は何ですか?

  • 走る作る
    $作る
    VAR = $(sudo echo "ls -lah")| VAR = $(sudo echo "ls -lah")|
    エコ$VAR
    {空の出力}
  • しかし走っているLSプール、期待どおりに動作します。これが私が望むMakefileコンテンツです。
$ls-lah
合計 405
-rw-rw-r-- 1 GaryGary405 7月22日 10:59 Makefile

実行する必要がある複雑なコマンドがあるため、これは問題を単純化するためのものです。

前にSUDOを追加する必要があるため、このアプローチが必要です。LSプール

ベストアンサー1

問題は、|別のサブシェルで2つのコマンド(割り当てVARとそれを使用するコマンド)を実行するため、あるsudoシェルで変数を設定すると同時に別のシェルで使用しようとしていることです。

また、最初のコマンドの出力を2番目のコマンドの標準入力に実際にパイプしないため、実際にパイプは必要ありません(ls実際には標準入力では何も得られません)。

これを行うには、|aに置き換えます。;(変数の内容を生成したコマンドが成功した場合にのみその部分を実行するので、使用する&&のにも適しています。)sudo

makeシェルは通常レシピの各行ごとに作成されるため、2つの行を同じ行に配置する必要があります。どちらも同じシェルで実行する必要があります。それ以外の場合は、VARあるシェルで設定し、別のシェルで使用しようとすると再び機能しません。

awsecrpush:
        VAR=$$( sudo echo "ls -lah" ) && bash -c "sudo -s $$VAR"

もう1つの可能性は、Make変数を使用することです。サブシェルについてあまり心配する必要はないので、これはより柔軟です。

GNU makeがあると仮定すると、次のものを使用できます。シェル機能最初のコマンドを実行し、その出力をMake変数に保存します。

awsecrpush:
        VAR := $(shell sudo echo "ls -lah")
        sudo -s $(VAR)

おすすめ記事