grepは、ターミナルコマンドラインとbashスクリプトで異なる結果を表します。

grepは、ターミナルコマンドラインとbashスクリプトで異なる結果を表します。

grepを使用して特定の拡張子と特定のディレクトリにあるファイルをフィルタリングするbashスクリプトがあります。スクリプトは次のとおりです。

generate_exclud_extensions() {
  echo "\"(cpp$"
}

generate_exclude_dirs() {
  echo "|^test)\""
}

command=$(generate_exclud_extensions)$(generate_exclude_dir)
echo $command
git ls-files | grep -vE $command

スクリプトは、cpp拡張子を持つファイルとtestディレクトリの下のファイルをフィルタリングする必要があります。しかし、結果は最初の項目だけをフィルタリングし、2番目の項目は残しました。

事実 1:echo $command出力"(cpp$|^test)"し、端末で完全なコマンドを実行すると、git ls-files | grep -vE ""(cpp$|^test)""正しい結果が得られました。

事実2:grepを次のように2回試しました。

git ls-files | grep -vE "cpp$" | grep -vE "^test"

Bashスクリプトでも同じエラーが発生しますが、端末で修正されました。

探していましたが、まだ運がありませんでした。誰もがこれについて明らかにすることができれば幸いです。

ベストアンサー1

問題を再現できました。これは2つの機能のbashエスケープの問題です。この試み:

generate_exclude_extensions() {
  echo '(cpp$'
}

generate_exclude_dirs() {
  echo '|^test)'
}

command=$(generate_exclude_extensions)$(generate_exclude_dirs)
echo "$command"
git ls-files | grep -vEe "$command"

再現したいコード

generate_exclude_extensions() {
  echo '(cpp$'
}

generate_exclude_dirs() {
  echo '|^test)'
}

command=$(generate_exclude_extensions)$(generate_exclude_dirs)
echo "$command"
echo -e 'cpp\n
test\n
test456\n
display?5\n' | grep -vEe "$command"

スクリプトに2つのタイプミスがあります

generate_exclude_dir -> generate_exclude_dirs
generate_exclud_extensions -> generate_exclude_extensions

:) 楽しくお過ごしください

おすすめ記事