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디렉터리 아래의 파일을 필터링해야 합니다. 그러나 결과는 첫 번째 항목만 필터링하고 두 번째 항목은 남겨 두었습니다.

사실 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/*'

관련 정보