Cómo usar el bash incorporado para reemplazar la salida de una subshell o función

9

Estoy tratando de usar la subcadena bash incorporada para reemplazar la salida de una subshell u otra función bash.

Los siguientes comandos funcionan bastante bien en zsh; pero da como resultado un bad substitutionerror en bash:

${${PWD##*/}//trunk/latest}

o

${$(basename $PWD)//trunk/latest}

la salida debería ser la última carpeta del $PWD, reemplazada por latestcuando mi directorio actual estrunk

entonces /home/user/trunkdebería convertirselatest

¿Hay un bash equivalente que permita encadenar ediciones de cadenas sin depender de variables o tuberías? ¿O bash incorporado solo permite que la entrada sea una cadena o una variable simple?

yabuki_joe
fuente

Respuestas:

9

No, esa anidación de operadores de sustitución es exclusiva de zsh.

Tenga en cuenta que con zshlike con (t)csh, también puede hacerlo ${PWD:t:s/trunk/latest/}.

Aunque bashtambié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}
Stéphane Chazelas
fuente
3

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]}

Ciro
fuente
0

Quieres...?

PWD=latest

No veo un método para su solicitud. Si desea reemplazar todo $PWDcon lo último, aunque la mejor manera de hacerlo es hacerlo cda lo último.

[ /home/user/trunk = "$PWD" ] && OLDPWD=../latest cd -

... que lo llevará a la última versión e imprimirá el nombre de ruta en stdout. Puede volver al lugar de donde vino cd -volviendo a hacerlo . 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
mikeserv
fuente
El problema no radica en la sustitución en sí, se puede lograr seden pocos pasos. Pero no entiendo por qué la basura bash para ejecutar subnivel, luego vuelva a su contenido como cualquier otra cadena
yabuki_joe