큰따옴표로 묶인 문자열에 ${:-=cat}를 삽입하는 방법은 무엇입니까?

큰따옴표로 묶인 문자열에 ${:-=cat}를 삽입하는 방법은 무엇입니까?

(아래는 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대신 사용) ?=catTMP

(물론 ${:-=cat}plain-ol' 대신에 같은 구성을 고려하는 유일한 이유는 =cat그것을 문자열에 삽입할 수 있기를 원하기 때문입니다. 작동하지 않는다는 사실에 놀랐습니다...)

답변1

에서 in 형식 zsh은 명령이 존재하고 옵션이 설정된 경우 지정된 명령의 전체 경로로 확장되는 =특수 확장 연산자입니다 .=wordwordEQUALS

큰따옴표 내에서는 확장이 수행되지 않으므로 ${:-=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

관련 정보