¿Por qué `${$(pwd)}` genera el directorio de trabajo actual en zsh?

¿Por qué `${$(pwd)}` genera el directorio de trabajo actual en zsh?

En zsh, ${$(pwd)}genere el directorio actual. Sin embargo, si ejecuto echo ${/path/to/somewhere}, solo muestra una línea vacía. ¿Por qué pasó esto? ¡Gracias!

Respuesta1

Supongo que hablas de print ${$(pwd)}algo así, ¿verdad?

La expansión ${$(pwd)}al directorio de trabajo actual es el comportamiento esperado, aunque puede parecer extraño a primera vista. No se deje engañar pensando que la sustitución del comando $(pwd)se evalúa primero y el resultado se utiliza comonombre de la variable... no, se utiliza comovalor variable como man zshexpnexplica:

${name} Se sustituye el valor, si lo hay, del nombre del parámetro.

(...) Si se usa una ${...}expresión de parámetro de tipo o una sustitución de comando de tipo en lugar de lo anterior, se expande primero y el resultado se usa como si fuera el valor de . (...) El formulario con suele ser útil en combinación con las banderas que se describen a continuación; vea los ejemplos a continuación.$(...)namename$(...)

(...) La bandera f es útil para dividir una sustitución entre comillas dobles línea por línea. Por ejemplo, ${(f)"$(<file)"}sustituye el contenido del archivo dividido para que cada línea sea un elemento de la matriz resultante.

A tu segundo ejemplo. Creo que esta es la sintaxis de reemplazo del patrón:

${name/pattern/repl} Reemplace la coincidencia de patrón más larga posible en la expansión del nombre del parámetro por cadena repl. (...)

Vea este ejemplo primero:

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

Si omites foote dice zshque haga una búsqueda y reemplace en la variable ${}, que está vacía:

$ print ${}

$

-- por lo tanto, ${/something/foo/bar}también devuelve una cadena vacía.

información relacionada