$ 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를 설정하세요.