명령의 변수 확장이 ZSH에서는 작동하지 않지만 BASH에서는 작동하는 이유는 무엇입니까?

명령의 변수 확장이 ZSH에서는 작동하지 않지만 BASH에서는 작동하는 이유는 무엇입니까?

환경 변수를 설정했고 명령을 호출할 때 이를 사용하고 싶지만 주사위가 없습니다.

변수가 없는 전체 명령이 작동합니다.

nacho@WouldntYouLikeToKnow ~ % ls -la ~/Downloads             
total 8675309
drwx------+ 16 nacho  staff        512 Sep 28 10:30 .
drwxr-x---+ 29 nacho  staff        928 Sep 29 10:39 ..

이제 변수를 설정하고 사용하려고 시도했지만 실패했습니다.

nacho@WouldntYouLikeToKnow ~ % export testing="-la ~/Downloads"

nacho@WouldntYouLikeToKnow ~ % ls $testing
ls: invalid option --  
usage: ls [-@ABCFGHILOPRSTUWabcdefghiklmnopqrstuvwxy1%,] [--color=when] [-D format] [file ...]

답변1

여러 개의 개별 문자열(매개변수)을 단일 문자열에 채우는 것은 적어도 해당 개별 문자열을 다시 추출해야 하는 경우에는 거의 항상 잘못된 접근 방식입니다.

당신이하고있는 일은 bash셸에서 작동합니다 ( 셸이 큰 따옴표 안에 물결표 확장을 수행하지 않기 때문에 $HOME대신 사용한다고 가정) . 문자열을 공백 문자로 분할하기 때문입니다 ( ; 및 Unquoted 변수 확장은 파일 이름 글로 빙을 결과 단어), 쉘에서는 수행하지 않습니다.~$IFSzsh

bash이 없기 때문에 작동한다는 점에 유의하십시오.다른문자열에 공백, 탭 또는 줄바꿈이 있고 문자열에 파일 이름 와일드카드가 포함되어 있지 않습니다. 당신의 방법은 확실히아니요bash예를 들어 경로 이름에 공백이 포함되어 있거나 이름이 지정된 디렉터리의 내용을 나열하려는 경우 를 사용할 수 있습니다 *.

두 셸의 변수에 별도의 명령줄 인수를 저장하는 올바른 방법은 배열을 사용하는 것입니다.

args=( -la ~/Downloads )

또는

args=( -l -A ~/Library/'Application Support' )

bash쉘 에서는 이것을 다음과 같이 사용할 수 있습니다.

ls "${args[@]}"

여기서는 각 요소가 개별적으로 참조되는 "${args[@]}"배열 요소 목록으로 확장됩니다 .args

쉘 에서는 zsh동일한 작업을 수행하거나 다음을 사용할 수 있습니다.

ls $args

여기서 zsh셸은 배열을 args별도의 요소로 확장합니다. 각 요소는 인수가 되지만 ls기본적으로 요소를 분할하거나 파일 이름 글로빙을 적용하지는 않습니다.

또한 이 예제에서는 물결표를 따옴표 없이 그대로 두어 쉘이 물결표를 사용자 홈 디렉토리의 경로 이름으로 확장할 수 있도록 합니다. 이 확장은 args값을 사용할 때가 아니라 배열에 할당할 때 발생합니다.

관련된:

관련 정보