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
:) 楽しくお過ごしください