ステータスがゼロ(/ bin / trueではない)で終了するコマンド?


11

少し時間がかかるツールを実行するMakefileがあります。使用するコマンドを置き換えることができます:

make TOOL=alternative-tool

Makefileでそのステップをスキップしたいので、ステータス0で終了し、副作用が無視できるコマンドを探しています。

明らかに、を使用することもできますがtrue、それはちょっと紛らわしいです:

make TOOL=true

これは、ツールを実行したいように見えますが、実行しません。

/bin/trueステータス0で終了しない、デフォルトでインストールされた実行可能ファイルはありますか?


Makefileはコメント、gnu.org / software / make / manual / html_node / Makefile -Contents.htmlをサポートします。行の前にコメントを入れて、コードを文書化します。これにより混乱が軽減され、特定のアプローチを使用した理由が説明されます。
フライハイト

1
何行?TOOL=trueおそらく近くのREADMEに記載メイクを、起動時にコマンドラインになります。ツールを呼び出す実際の行は、7000行(サードパーティ)のメイクファイル内のどこかにあります。
ロジャーリップスコム

回答:


42

「ではない/bin/true」ものを求めたとしても、それが「真」という他の意味ではなくプログラムであることを示すtrueためにフルネームに置き換えるのがおそらく最良の解決策です。/bin/truetrue

あなたの懸念があることであるtrue

make TOOL=true

コマンド名以外のように見えます。しかし、あなたが書くなら

make TOOL=/bin/true

それは明確にコマンドです。誰かがTOOL=trueどこか他のツールが意図されていることを意味すると誤解するかもしれませんが、そのような誤読はTOOL=/bin/trueありそうにありません。


いつ:シェルが組み込まれているのか、外部コマンドではないのか、いつ機能するのかわかりません。ヘニングマックホルムうまくいっいるようだと報告した。しかし、私はそれがすべての状況で機能するとは限らないと思います

シェルエイリアスについては、コマンドに渡す引数でエイリアス展開が実行されないため、また、メイクファイルは以前に定義されたシェルエイリアスを使用しないため、これを使用することはできません。make新しいシェルでコマンドを実行しても、そのシェルにはエイリアスがありません(エイリアスが展開されても自動的に有効化されない非対話型シェルであるため、エイリアスがあったとしても使用しません)。


1
使用:は私にとってはうまくいくようです。make独自の置換が行われた後、各コマンドを実行するために常にシェルが生成されます。
hmakholmは、モニカに

@HenningMakholmありがとう、編集しました。回答を投稿することもできます。Lok Lam Chengは、提案する質問についてコメントしてました:が、回答(特に正しい場合)である必要があり、そのコメントは、なぜそれが機能すると期待すべきかを説明していません。hello.cmake helloコンパイルさhello.cれるメイクファイルのないディレクトリで、あなたが言っていることに応じて動作することがhelloわかりましたmake CC=: hello
エリアケイガン

2
残念ながら、この特定のMakefile(erlang.mkを使用)では、using :は機能しません。/bin/trueおそらくそれを行うための最善の方法は、明示することです。
ロジャーリップスコム

7

完全なパスを使用trueするのが最善の解決策であることに同意しますが、実際のコマンドの実行を回避するためのおそらく最も一般的な方法は、そのecho前に固執することに注意したいと思います。そう:

make TOOL=echo

これは、アクションTOOLがなければ抑制されることを思い出すことが重要な場合に役立つことがあります。なし-sまたは同等の、make両方のために、冗長な情報を発するmakeecho、コマンドの実行によってmake別々に放出する出力。たとえば、makefile make CC=echo hellohello.cあり、makefile がないディレクトリで実行すると、echo hello.c -o hello出力の最初の行とhello.c -o hello2番目の行が表示されます。しかし、一部のビルドはを使用(またはユーザーが追加)し-s、それが役立ちます。make -s CC=echo helloちょうど与えますhello.c -o hello
エリアケイガン

(コマンドにシェル拡張が含まれる場合はまだ有用かもしれませんので、興味があれば実行されているものの明確なアイデアを得ることができます)
-muru

5

ゼロの終了ステータスを返す以外は何もしない独自のコマンドをいつでも作成できます。いくつかのオプション:

  • 適切な名前のシンボリックリンク /bin/true

  • 空のシェルスクリプト

  • ほぼ空のCプログラム:

    int main() {
        return 0;
    }

このようなプログラムの適切な名前は、noopまたはno-opです。
arp

0

作業ディレクトリに/ bin / trueのような名前のシンボリックリンクを作成しますskip。したがって...

skip -> /bin/true

その後、メイクラインは...

make TOOL=./skip

-2

少し文字を増やしてこれを行う方法を次に示します。

function T() { /bin/true; }

一度実行したら、名前を使用するだけで再実行できますT

false; T; echo $?

3
Make関数の値からこの関数を呼び出す方法を説明してください(問題の状況で使用するため)。
デビッドフォースター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.