リダイレクトコマンド

リダイレクトコマンド

検索スクリプトを作成しました。.ini特定の単語を送信してください。

これ.iniファイルの名前は2つのうちの1つです(家庭)。構成ファイルまたは構成ファイル)なので、両方を確認する必要があります。

if私は次の文を処理するためにロジックを使用しますOR

HAS_SOME_WORD=FALSE
if    [ "$(grep -v '^;\|^\[' "path_to_file/config.ini" | \
           grep -c '\\some_word')" -ge 1 ] \
   || [ "$(grep -v '^;\|^\[' "path_to_file/configuration.ini" | \          
          grep -c '\\some_word')" -ge 1 ]; then 
    HAS_SOME_WORD=TRUE
else
    HAS_SOME_WORD=FALSE
fi

私は次から始まる行を避けています。";"または「[」単語を探すとき、あなたが探している検索にその単語を含めないでください。「\ある単語」

私が望むのは、2つのファイルのうちの1つが存在しないときにgrepエラーメッセージを除外することです。つまり:

grep: path_to_file/config.ini: No such file or directory

または:

grep: path_to_file/configuration.ini: No such file or directory

/dev/nullスクリプトの実行時に出力をリダイレクトすることでこれを防ぐことができました。

./search_script.sh 2>/dev/null

ifしかし、スクリプトが呼び出されるときではなく、コード自体にこのリダイレクトを含めたいと思います。

これをどのように実装しますか?私がやろうとしていることを達成するためのより効率的な方法はありますか?

-qエラーメッセージの印刷を避けるためにパラメータを追加してみましたが、grep役に立ちませんでした。また、2>/dev/null各文の最後にリダイレクトを追加してみましたが、if正しい構文を適用していないようです。

答え1

grep複数のファイルを検索してコードを簡素化-vできるので、次のことを試してください。-c

cd "path_to file"
if grep -qs '^[^;[].*\\some_word' config.ini configuration.ini ; then 
    # ...etc
fi
cd -

grep長いフォーマットオプション:

grep --quiet --no-messages '^[^;[].*\\some_word' \
     config.ini configuration.ini 

OPコード-v(または--invert-match)と2番目のコードは、正規表現などの操作を一度に実行できるため、grep必要ありません。^[^;[]からman grep

角かっこ式は、次に囲まれた文字のリストです。[そして]。リストの最初の文字がカラットの場合、リストのすべての単一文字と一致します。^その後、すべての文字と一致します。いいえリストにあります。

答え2

これその他の回答、提案--no-messages/ -sあなたの質問はより具体的ですが、以下は「自動」オプションのないコマンドにも適用されます。

リダイレクトコマンド

リダイレクトエラー簡単なコマンド、リダイレクトにはこのコマンドを使用する必要があります。パイプラインの同じ場所で:

if [ "$(grep -v '^;\|^\[' "path_to_file/config.ini" 2>/dev/null | \
  grep -c '\\some_word')" -ge 1 ] \

1つ目grepは、「該当するファイルやディレクトリがありません」というメッセージを生成することであるため、リダイレクトする必要があるメッセージです。

パイプラインリダイレクト

パイプラインのさまざまな部分でエラーが発生する可能性がある場合は、パイプライン全体を1つの場所に配置できます。グループ、リダイレクトが続きます。

if [ "$( ( grep -v '^;\|^\[' "path_to_file/config.ini" | \
  grep -v -f "path_to_file/ignored_patterns" | \
  grep -c '\\some_word' )  2>/dev/null )" -ge 1 ] \

条件付き構成リダイレクト

全体をリダイレクトできます。if 構造最後の後ろにリダイレクトを配置すると、次のようになりますfi

if [ "$(grep -v '^;\|^\[' "path_to_file/config.ini" | \
    grep -c '\\some_word')" -ge 1 ] \
 ...
else
 ...
fi 2>/dev/null

これにより、すべてのコマンドのエラーがリダイレクトされます(すべてテスト -そして結果--)ブロック内。

関連情報