Como interpolar $ {: - = cat} dentro de uma string de aspas duplas?

2

(No seguinte, cat é um substituto para "qualquer comando em $PATH ".)

Considere este exemplo:

% TMP=${:-=cat}
% FOO="blah blah blah $TMP blah blah blah"
% echo $FOO
blah blah blah /bin/cat blah blah blah

A interpolação direta de ${:-=cat} na string não alcança a mesma coisa:

% FOO="blah blah blah ${:-=cat} blah blah blah"
% echo $FOO
blah blah blah =cat blah blah blah

Existe uma maneira de alcançar o mesmo resultado final de antes (ou seja, com /bin/cat em vez de =cat na string final) sem ter que criar a variável intermediária TMP ?

(É claro que a única razão para considerar um constructo como ${:-=cat} em vez de simples =cat é a esperança de ser capaz de interpolá-lo em uma string. Fiquei surpreso ao descobrir que ele não faz isso. t trabalho ...)

    
por kjo 19.10.2015 / 01:49

1 resposta

4

Em zsh , = na forma de =word é um operador de expansão especial e será expandido para o caminho completo do comando denominado word se o comando existir e a opção EQUALS estiver definida .

Essa expansão não é executada entre aspas duplas, portanto, usar ${:-=cat} entre aspas duplas não funcionará:

$ TMP="${:-=cat}"
$ print -rl -- $TMP
=cat

Agora, você tem várias opções para conseguir a mesma coisa que deseja.

Não use aspas duplas:

$ FOO="blah blah blah "${:-=cat}" blah blah blah"
$ print -rl -- $FOO
blah blah blah /bin/cat blah blah blah

O módulo zsh/parameter fornece a matriz associativa commands , fornecendo acesso à tabela de hash do comando. Você pode usar $commands[name] para obter o caminho completo do comando name :

$ zmodload zsh/parameter
$ print -rl -- $commands[cat]
/bin/cat

Outra opção é usar o modificador :c :

$ var=cat
$ print -rl -- $var:c
/bin/cat
$ print -rl "foo ${${:-cat}:c} bar"
foo /bin/cat bar

Claro, você também pode usar o comando padrão command -v :

$ print -rl -- "foo $(command -v cat) bar"
foo /bin/cat bar
    
por 19.10.2015 / 04:17

Tags