![grep은 터미널 명령줄과 bash 스크립트에서 다른 결과를 나타냅니다.](https://linux55.com/image/185329/grep%EC%9D%80%20%ED%84%B0%EB%AF%B8%EB%84%90%20%EB%AA%85%EB%A0%B9%EC%A4%84%EA%B3%BC%20bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%EB%8B%A4%EB%A5%B8%20%EA%B2%B0%EA%B3%BC%EB%A5%BC%20%EB%82%98%ED%83%80%EB%83%85%EB%8B%88%EB%8B%A4..png)
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
디렉터리 아래의 파일을 필터링해야 합니다. 그러나 결과는 첫 번째 항목만 필터링하고 두 번째 항목은 남겨 두었습니다.
사실 1: echo $command
출력 "(cpp$|^test)"
하고 터미널에서 전체 명령을 실행하면 git ls-files | grep -vE ""(cpp$|^test)""
올바른 결과를 얻었습니다.
사실 2: grep을 다음과 같이 두 번 시도했습니다.
git ls-files | grep -vE "cpp$" | grep -vE "^test"
Bash 스크립트에서도 동일한 오류가 발생하지만 터미널에서는 수정되었습니다.
찾고 있었지만 아직 운이 없었습니다. 누구든지 이것에 대해 밝힐 수 있다면 감사하겠습니다.
답변1
문제를 재현할 수 있었습니다. 이는 두 가지 기능의 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"
스크립트에 오타가 두 개 더 있습니다
generate_exclude_dir -> generate_exclude_dirs
generate_exclud_extensions -> generate_exclude_extensions
:) 재미있게 보내세요
답변2
또 다른 접근 방식은 다음과 같습니다.
generate_exclude_extensions() {
echo 'cpp$'
}
generate_exclude_dirs() {
echo '^test'
}
exclusions=$(
generate_exclude_extensions
generate_exclude_dir
)
printf '%s\n' "$exclusions"
git ls-files | grep -ve "$exclusions"
즉, 한 줄에 하나의 제외 항목이 있으면 -E
.
답변3
힘내를 사용할 수 있습니다exclude
경로 지정필터 출력:
exclude_extensions=( '*cpp' '*.txt' ) # added `*.txt` as sample file extension
exclude_dirs=( 'test/*' ) # exclude files in relative directory `test`
git ls-files "${exclude_extensions[@]/#/:(exclude)}" "${exclude_dirs[@]/#/:(exclude)}"
매개변수 확장은 "${exclude_...[@]/#/:(exclude)}"
접두사가 붙은 공백으로 구분된 항목 배열과 그 뒤에 :(
경로 지정 "magic word" 가 오는 배열 로 확장됩니다 .exclude
)
결과 명령은 다음과 같습니다.
git ls-files ':(exclude)*cpp' ':(exclude)*.txt' ':(exclude)test/*'