web-dev-qa-db-ja.com

プロセスの戻り値を無効にするにはどうすればよいですか?

プロセスが返す値を無効にする、シンプルだがクロスプラットフォームのnegate-processを探しています。 0を何らかの値!= 0および任意の値!= 0から0にマッピングする必要があります。つまり、次のコマンドは「yes、nonexistingpath does not exist」を返します。

 ls nonexistingpath | negate && echo "yes, nonexistingpath doesn't exist."

! -演算子は素晴らしいですが、残念ながらシェルに依存しません。

79
secr

Bashでは、!コマンドの前の演算子。例えば:

! ls nonexistingpath && echo "yes, nonexistingpath doesn't exist"
39
Jay Conrod

あなたが試すことができます:

ls nonexistingpath || echo "yes, nonexistingpath doesn't exist."

あるいは単に:

! ls nonexistingpath
17
Eduard Wirch

何らかの理由でシェルとしてBashがない場合(例:gitスクリプト、またはpuppet execテスト)、次を実行できます。

echo '! ls notexisting' | bash

-> retcode:0

echo '! ls /' | bash

-> retcode:1

9
cardil
! ls nonexistingpath && echo "yes, nonexistingpath doesn't exist."

または

ls nonexistingpath || echo "yes, nonexistingpath doesn't exist."
2
Robert Gamble

注:ときどき!(command || other command)が表示されます。
ここでは! ls nonexistingpath && echo "yes, nonexistingpath doesn't exist."で十分です。
サブシェルは不要です。

Git 2.22(Q2 2019)は、次のような優れた形式を示しています。

コミット74ec8cfcommit 3fae7adcommit 0e67c32commit 07353d9commit 3bc2702コミット8c3b9f7コミット80a539aコミットc5c39f4 (2019年3月13日)作成 SZEDERGábor(szeder
を参照 commit 99e37c2commit 9f82b2acommit 900721e (2019年3月13日)by Johannes Schindelin(dscho
浜野潤夫-gitster- in commit 579b75a 、2019年4月25日)

t9811-git-p4-label-import:パイプラインの否定を修正

't9811-git-p4-label-import.sh'では、テスト 'tag that cannot be exported'が実行されます。

!(p4 labels | grep GIT_TAG_ON_A_BRANCH)

指定された文字列が 'p4 labels'で出力されないことを確認します。
これは問題があります。 [〜#〜] posix [〜#〜]

「パイプラインが予約語!で始まり、command1がサブシェルコマンドである場合、アプリケーションは、(の先頭のcommand1演算子が! 1つ以上の<blank>文字。
予約語!の直後に(演算子が続く動作は指定されていません。 "

ほとんどの一般的なシェルはまだこの「!」を「パイプラインの最後のコマンドの終了コードを無効にする」と解釈しますが、「mksh/lksh」は代わりに負のファイル名パターンとして解釈しません。
その結果、彼らは現在のディレクトリ( 'main'と呼ばれる単一のディレクトリを含む)のパス名で構成されるコマンドを実行しようとしますが、もちろんテストに失敗します。

'!'と '('の間にスペースを追加するだけで修正できますが、代わりに不要なサブシェルを削除して修正します。特に、 Commit 74ec8cf

0
VonC