찾기: 표현식을 변수로 바꾸기

찾기: 표현식을 변수로 바꾸기
$ find -name "Bik*"
./Biking
./Biking/Unsync/Biking.md.~6~
./Biking/Rendered/Biking.gen.html
./Biking/Biking.md

이제 표현식을 다음과 같은 변수로 바꾸면:

$ a='-name "Bik*"'

$ find $a

나는 어떤 결과도 얻지 못한다. 왜 그럴까요? 그리고 무엇을 수정해야 합니까?

답변1

(대화형 쉘로 사용하지 않는 한 zsh...) 문제는 큰따옴표가 패턴의 일부로 간주된다는 것입니다. 실제로 실행하는 명령은 다음과 같습니다.

find . -name '"Bik*"'

우리는 쉘이 인용되지 않은 문자열에 대해 단어 분할을 수행하여 $a문자열을 두 단어 -name와 로 분할하기 때문에 이를 얻습니다 "Bik*". 그런 다음 이러한 단어는 파일 이름("globbing")을 생성합니다. 즉, "Bik*"현재 디렉터리에서 해당 특정 패턴(큰따옴표 포함)과 일치하는 모든 파일 이름으로 확장됩니다. 그러한 파일 이름이 있을 가능성은 거의 없으므로 패턴은 확장되지 않은 상태로 유지되고 따옴표도 그대로 유지됩니다.

사용해보신 분 a='-name Bik*'은 있으실 겁니다.일했다Bik*, 그러나 현재 디렉터리에 일치하는 항목이 없는 경우에만 해당됩니다.

에서 bash사용 하면 패턴이 할당되지 않으므로 shopt -s nullglob두 시도 모두 오류가 발생합니다 (셸이 일치하지 않는 패턴을 제거함).find-name

zsh( 쉘 에서는 find어떤 옵션이 있는지 모르기 때문에 오류가 발생합니다 -name "Bie*". 즉,전체 문자열, 그렇습니다. 이는 zsh기본적으로 셸이 인용되지 않은 확장에 대해 이러한 분할 및 글로벌 작업을 수행하지 않기 때문입니다. )

대신 배열이 포함된 셸을 사용하는 경우 다음을 사용하세요.

a=( -name 'Bik*' )
find . "${a[@]}"

find여기에 표시된 대로 사용하면 각 개별 단어가 올바르게 인용됩니다.

또는 다음을 사용할 수 있습니다.

a='Bik*'
find . -name "$a"

관련된:

반품후반~의내 솔루션도착하다함수 내부에 -f를 설정하세요.

관련 정보