Grep コマンドは期待されるテスト結果を返しません。

Grep コマンドは期待されるテスト結果を返しません。

profile.dファイルに条件を追加する前に比較しようとしています。

Aはgrep -F 'TMOUT' /etc/profile.d/sh.local私が期待していることを正確に示していますが、テストは常に事実として現れます。この例では、sh.localに必要な情報を追加しましたが、その情報が存在する場合は再度追加したくありません。

[ ! `grep -Fq 'TMOUT' /etc/profile.d/sh.local` ] && echo $?
0
[ ! `grep -Fq 'NOT_PRESENT' /etc/profile.d/sh.local` ] && echo $?
0

.ebextensionコマンドのためですが、展開を試みる前にテストが失敗し、最終結果は次のようになると思いましたが、明らかに間違っていました。私は `grep` で $(grep) を使ってみました。そして== 1対!

  01_hard_5.4.5_shell_timeout:
    test: "[ $(grep -Fxq 'TMOUT' /etc/profile.d/sh.local) ==1 ]"
    command: |
      printf '\nTMOUT=300\nreadonly TMOUT\nexport TMOUT\n' | sudo tee -a /etc/profile.d/sh.local >/dev/null

ちなみにこれはAmazon Linux 2で、次のコマンドは次のように出力します。

grep -F 'TMOUT' /etc/profile.d/sh.local
TMOUT=300
readonly TMOUT
export TMOUT

grep -F 'NOT_PRESENT' /etc/profile.d/sh.local

答え1

存在する

[ ! `grep -Fq 'TMOUT' /etc/profile.d/sh.local` ] && echo $?
0
[ ! `grep -Fq 'NOT_PRESENT' /etc/profile.d/sh.local` ] && echo $?
0

grepコマンドフォームの周りのバックティックコマンドの置き換え、コマンドの標準出力を返します。を使用したため、-q標準出力は常に空であるため、どの文字列をgrepしても、テストは次のよう[ ! ... ]になります。

[ ! ]

これはテスト構成の「単一引数形式」であり、単一文字文字列が空でないことをテストします。!これは常にtrueです。

テスト終了ステータス使用できる grep コマンドは次のとおりです。

grep -Fq 'TMOUT' /etc/profile.d/sh.local && echo $?

また、見ることができます


同様に、

[ $(grep -Fxq 'TMOUT' /etc/profile.d/sh.local) ==1 ]

~になる

[ ==1 ]

これは、少なくともメッセージでエラーが発生する文字列を==1作成しようとしたときにnullでないかどうかをテストします。== 1[: ==: unary operator expected

関連情報