
Estoy intentando usar las expansiones de parámetros de Bash para modificar el resultado de una sustitución de comando u otra expansión de parámetros.
Las siguientes expansiones anidadas funcionan bastante bien en Zsh; pero resulta en un error de "mala sustitución" en Bash:
${${PWD##*/}//trunk/latest}
o
${$(basename $PWD)//trunk/latest}
la salida debe ser la última carpeta de $PWD
, reemplazada por latest
cuando mi directorio actual seatrunk
así /home/user/trunk
debería serlatest
¿Existe un equivalente de Bash que permita encadenar expansiones sin depender de variables o canalizaciones? ¿O las expansiones de Bash solo permiten que la entrada sea una cadena o una variable simple?
Respuesta1
No, ese anidamiento de operadores de sustitución es exclusivo de zsh
.
Ten en cuenta que con zsh
like con (t)csh
, también puedes hacerlo ${PWD:t:s/trunk/latest/}
.
Aunque bash
también admite esos modificadores de historial de csh para la expansión del historial, no los admite para sus expansiones de parámetros.
Aquí con bash
, use una variable temporal:
var=${PWD##*/} var=${var//trunk/latest}
Respuesta2
Prueba esto con bash:
[[ $PWD =~ .*/(.*) ]] && echo "${BASH_REMATCH[1]//trunk/latest}"
o con un comando:
[[ $PWD =~ .*/(.*) && ${BASH_REMATCH[1]//trunk/latest} =~ (.*) ]]
El resultado está en${BASH_REMATCH[1]}
Respuesta3
Quieres...?
PWD=latest
No veo un método para su solicitud. Si desea reemplazar todo $PWD
con lo último, la mejor manera de hacerlo es hacerlo con cd
lo último.
[ /home/user/trunk = "$PWD" ] && OLDPWD=../latest cd -
...que lo llevará a la última versión e imprimirá el nombre de la ruta a la salida estándar. Puedes volver al lugar de donde viniste si lo cd -
vuelves a hacer. Puedes hacer lo mismo con $CDPATH
:
mkdir -p /tmp/{1..5} ; \
CDPATH=/tmp cd 3; cd -; \
echo "${CDPATH:-empty or unset::}" "$OLDPWD"
/tmp/3
/home/mikeserv
empty or unset:: /tmp/3