(아래는 cat
"모든 명령"에 대한 대안입니다 $PATH
.)
다음 예를 고려하십시오.
% TMP=${:-=cat}
% FOO="blah blah blah $TMP blah blah blah"
% echo $FOO
blah blah blah /bin/cat blah blah blah
${:-=cat}
문자열에 직접 보간해도 동일한 효과를 얻을 수 없습니다.
% FOO="blah blah blah ${:-=cat} blah blah blah"
% echo $FOO
blah blah blah =cat blah blah blah
중간 변수를 만들지 않고도 이전과 동일한 최종 결과를 얻을 수 있는 방법이 있습니까(즉, 최종 문자열 /bin/cat
대신 사용) ?=cat
TMP
(물론 ${:-=cat}
plain-ol' 대신에 같은 구성을 고려하는 유일한 이유는 =cat
그것을 문자열에 삽입할 수 있기를 원하기 때문입니다. 작동하지 않는다는 사실에 놀랐습니다...)
답변1
에서 in 형식 zsh
은 명령이 존재하고 옵션이 설정된 경우 지정된 명령의 전체 경로로 확장되는 =
특수 확장 연산자입니다 .=word
word
EQUALS
큰따옴표 내에서는 확장이 수행되지 않으므로 ${:-=cat}
큰따옴표 안에 사용해도 효과가 없습니다.
$ TMP="${:-=cat}"
$ print -rl -- $TMP
=cat
이제 원하는 동일한 목표를 달성할 수 있는 여러 가지 옵션이 있습니다.
주위에 큰따옴표를 사용하지 마십시오.
$ FOO="blah blah blah "${:-=cat}" blah blah blah"
$ print -rl -- $FOO
blah blah blah /bin/cat blah blah blah
이 zsh/parameter
모듈은 commands
명령 해시 테이블에 대한 액세스를 제공하는 연관 배열을 제공합니다. 다음을 사용하여 $commands[name]
명령의 전체 경로를 얻을 수 있습니다 name
.
$ zmodload zsh/parameter
$ print -rl -- $commands[cat]
/bin/cat
또 다른 옵션은 다음을 사용하는 것입니다.:c
수정자:
$ var=cat
$ print -rl -- $var:c
/bin/cat
$ print -rl "foo ${${:-cat}:c} bar"
foo /bin/cat bar
물론 표준 command -v
명령을 사용할 수도 있습니다.
$ print -rl -- "foo $(command -v cat) bar"
foo /bin/cat bar