Por que `${$(pwd)}` gera o diretório de trabalho atual em zsh?

Por que `${$(pwd)}` gera o diretório de trabalho atual em zsh?

No zsh, ${$(pwd)}produza o diretório atual. No entanto, se eu executar echo ${/path/to/somewhere}, ele mostrará apenas uma linha vazia. Por que isso acontece? Obrigado!

Responder1

Presumo que você esteja falando sobre print ${$(pwd)}ou algo parecido, certo?!

A expansão ${$(pwd)}para o diretório de trabalho atual é o comportamento esperado, embora possa parecer estranho à primeira vista. Não se deixe enganar pensando que a substituição do comando $(pwd)é avaliada primeiro e o resultado é usado comonome variável... não, é usado comovalor variável como man zshexpnexplica:

${name} O valor, se houver, do nome do parâmetro é substituído.

(...) Se uma ${...}expressão de parâmetro de tipo ou uma $(...)substituição de comando de tipo for usada no lugar nameacima, ela será expandida primeiro e o resultado será usado como se fosse o valor de name. (...) O formulário with $(...)é frequentemente útil em combinação com os sinalizadores descritos a seguir; veja os exemplos abaixo.

(...) O sinalizador f é útil para dividir uma substituição entre aspas linha por linha. Por exemplo, ${(f)"$(<file)"}substitui o conteúdo do arquivo dividido para que cada linha seja um elemento do array resultante.

Para o seu segundo exemplo. Acho que esta é a sintaxe de substituição do padrão:

${name/pattern/repl} Substitua a correspondência de padrão mais longa possível na expansão do nome do parâmetro por string repl. (...)

Veja este exemplo primeiro:

$ foo=hello
$ print ${foo/hello/good/bye}
good/bye

Se omitir foovocê manda zshfazer uma busca e substituir na variável ${}, que está vazia:

$ print ${}

$

-- portanto, ${/something/foo/bar}também retorna uma string vazia.

informação relacionada