환경 변수를 설정했고 명령을 호출할 때 이를 사용하고 싶지만 주사위가 없습니다.
변수가 없는 전체 명령이 작동합니다.
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 변수 확장은 파일 이름 글로 빙을 결과 단어), 쉘에서는 수행하지 않습니다.~
$IFS
zsh
bash
이 없기 때문에 작동한다는 점에 유의하십시오.다른문자열에 공백, 탭 또는 줄바꿈이 있고 문자열에 파일 이름 와일드카드가 포함되어 있지 않습니다. 당신의 방법은 확실히아니요bash
예를 들어 경로 이름에 공백이 포함되어 있거나 이름이 지정된 디렉터리의 내용을 나열하려는 경우 를 사용할 수 있습니다 *
.
두 셸의 변수에 별도의 명령줄 인수를 저장하는 올바른 방법은 배열을 사용하는 것입니다.
args=( -la ~/Downloads )
또는
args=( -l -A ~/Library/'Application Support' )
bash
쉘 에서는 이것을 다음과 같이 사용할 수 있습니다.
ls "${args[@]}"
여기서는 각 요소가 개별적으로 참조되는 "${args[@]}"
배열 요소 목록으로 확장됩니다 .args
쉘 에서는 zsh
동일한 작업을 수행하거나 다음을 사용할 수 있습니다.
ls $args
여기서 zsh
셸은 배열을 args
별도의 요소로 확장합니다. 각 요소는 인수가 되지만 ls
기본적으로 요소를 분할하거나 파일 이름 글로빙을 적용하지는 않습니다.
또한 이 예제에서는 물결표를 따옴표 없이 그대로 두어 쉘이 물결표를 사용자 홈 디렉토리의 경로 이름으로 확장할 수 있도록 합니다. 이 확장은 args
값을 사용할 때가 아니라 배열에 할당할 때 발생합니다.
관련된: