私はmakefileルールでecho
、、、、mv
のif
ようなものを見ました。for
一種のシェルコマンドが認識されるようです。これはカーニバルですか?どのシェルが使用されているか、および利用可能なキーワードの完全なリストをどのように知ることができますか?
答え1
それsh
:
その後、実行行は引数として渡されたようにシェルによって実行されます。システム()相互作用
system()
sh
次のキーワードを使用できます。POSIX シェルコマンド言語、ホストプラットフォームで使用できるようにしたいキーワード以外のコマンド。
sh
実際には、システム内の他のシェル(たとえばbash
)の別の名前である可能性があります。この場合、より多くのオプションを使用できます。ただし、このmakefileは移植可能ではありません。
GNU makeについて具体的に質問するとき、私はまたGNU makeを使って次のことができることに言及しました。異なるシェルの指定makefile で使用されますが、makefile はmake
POSIX 規則に従ってsh
デフォルトで使用されます。
答え2
皆さんもぜひご覧くださいPolyGlot生成ファイル、特定のmakefileターゲットのシェル選択の簡単な説明です。
ここで bash というターゲットに対して bash を選択しました。
.ONESHELL:
bash: SHELL := bash
bash:
# note: the double dollar-sign is required because Make substitues $variables
export greeting="¡hola"
echo "$${greeting}, bash!"
これはただ自慢することです:
.ONESHELL:
python: SHELL := python3
python:
greeting = "hello"
print(f"{greeting}, python!")
次にmake python
「Hello、python!」を印刷します。
答え3
@Michael(+1)がすべてを話し、詳細についての指示を提供しました。それにもかかわらず、私は2つの詳細を強調したいと思います(修正してください):
アクションを生成するには、「sh」を使用してください
gnumakeに役立つ場合は、シェルをオーバーライドできます。
シェル=バッシュ
そしてbashトリックを使用してください。
(UNIXベースの環境では) -
mv
はecho
コマンド(すべてのシェルで使用可能)であり、if
shfor
/ bashの依存関係です。シェルは引用(そしてglobとvarの拡張...)に関して異なる動作を持ち、
make
いくつかの特別な動作もあります。Windowsなどでは、gnumakeコマンドとともに、ある種のUnixサバイバルツールキット(sh / bash、いくつかのフィルタ、fileutils、および一般的にmake操作に使用されるコマンド)をインストールすると便利です。