Jak użyć wbudowanego basha do zastąpienia danych wyjściowych podpowłoki lub funkcji

9

Próbuję użyć wbudowanego podciągu bash, aby zastąpić wyjście podpowłoki lub innej funkcji bash.

Następujące polecenia działają całkiem dobrze w zsh; ale powoduje bad substitutionbłąd w bash:

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

lub

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

wyjście powinno być ostatnim folderem $PWD, zastąpionym przez, latestgdy mój bieżący katalog totrunk

tak /home/user/trunkpowinno się staćlatest

Czy istnieje odpowiednik bash umożliwiający edycję łańcuchów ciągów bez polegania na zmiennych lub potokach? Czy też wbudowane bash pozwalają, aby dane wejściowe były ciągiem znaków lub zwykłą zmienną?

yabuki_joe
źródło

Odpowiedzi:

9

Nie, to zagnieżdżanie operatorów podstawiania jest unikalne dla zsh.

Zauważ, że z zshlike with (t)cshmożesz to zrobić ${PWD:t:s/trunk/latest/}.

Chociaż bashobsługuje również te modyfikatory historii csh do rozszerzania historii, nie obsługuje ich dla rozszerzeń parametrów.

W tym przypadku bashużyj zmiennej tymczasowej:

var=${PWD##*/} var=${var//trunk/latest}
Stéphane Chazelas
źródło
3

Spróbuj tego z bash:

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

lub za pomocą jednego polecenia:

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

Wynik jest w ${BASH_REMATCH[1]}

Cyrus
źródło
0

czy chcesz...?

PWD=latest

Nie widzę metody na twoją prośbę. Jeśli chcesz wymienić wszystkie $PWDw / najnowsze - choć najlepszym sposobem na to jest cddo najnowszego.

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

... który zabierze Cię do najnowszego i wydrukuje nazwę ścieżki na standardowe wyjście. Możesz wrócić tam, skąd przyszedłeś, robiąc to cd -ponownie. Możesz zrobić to samo w / $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
źródło
Problem nie dotyczy samej substytucji, można to osiągnąć sedw kilku krokach. Ale nie rozumiem, dlaczego bash odmawia wykonania podpowłoki, a następnie zastępuje jej zawartość jak każdy inny ciąg
yabuki_joe