Comment utiliser le bash intégré pour remplacer la sortie d'un sous-shell ou d'une fonction

9

J'essaie d'utiliser la sous-chaîne bash intégrée pour remplacer la sortie d'un sous-shell ou d'une autre fonction bash.

Les commandes suivantes fonctionnent assez bien dans zsh; mais entraîne une bad substitutionerreur dans bash:

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

ou

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

la sortie doit être le dernier dossier du $PWD, remplacé par latestlorsque mon répertoire actuel esttrunk

/home/user/trunkdevrait donc devenirlatest

Existe-t-il un équivalent bash permettant de chaîner des éditions de chaînes sans compter sur des variables ou des pipes? Ou les bash intégrés ne permettent-ils que l'entrée d'être une chaîne ou une variable ordinaire?

yabuki_joe
la source

Réponses:

9

Non, l'imbrication des opérateurs de substitution est unique à zsh.

Notez qu'avec zshcomme avec (t)csh, vous pouvez aussi faire ${PWD:t:s/trunk/latest/}.

Bien qu'il prenne bashégalement en charge ces modificateurs d'historique csh pour l'expansion de l'historique, il ne les prend pas en charge pour ses extensions de paramètres.

Ici avec bash, utilisez une variable temporaire:

var=${PWD##*/} var=${var//trunk/latest}
Stéphane Chazelas
la source
3

Essayez ceci avec bash:

[[ $PWD =~ .*/(.*) ]] && echo "${BASH_REMATCH[1]//trunk/latest}"

ou avec une seule commande:

[[ $PWD =~ .*/(.*) && ${BASH_REMATCH[1]//trunk/latest} =~ (.*) ]]

Le résultat est en ${BASH_REMATCH[1]}

Cyrus
la source
0

Veux-tu...?

PWD=latest

Je ne vois pas de méthode à votre demande. Si vous souhaitez remplacer tous les $PWDw / latest - bien que la meilleure façon de le faire soit de cdto latest.

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

... qui vous amènera à la dernière version et imprimera le chemin vers stdout. Vous pouvez revenir directement d'où vous venez en cd -recommençant. Vous pouvez faire de même avec $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
la source
Le problème ne réside pas dans la substitution elle-même, elle peut être réalisée seden quelques étapes. Mais je ne comprends pas pourquoi bash refuse d'exécuter le sous-shell, puis remplace son contenu comme n'importe quelle autre chaîne
yabuki_joe