Как использовать встроенную функцию bash для замены вывода подоболочки или функции

9

Я пытаюсь использовать встроенную подстроку bash для замены вывода подоболочки или другой функции bash.

Следующие команды довольно хорошо работают в zsh; но приводит к bad substitutionошибке в bash:

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

или

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

вывод должен быть последней папкой $PWD, замененной на latestкогда мой текущий каталогtrunk

так /home/user/trunkдолжно статьlatest

Существует ли эквивалент bash, позволяющий объединять строки в цепочку, не полагаясь на переменные или каналы? Или встроенные команды bash позволяют вводить только строковые или простые переменные?

yabuki_joe
источник

Ответы:

9

Нет, эта вложенность операторов подстановки уникальна для zsh.

Обратите внимание, что с, zshкак с (t)csh, вы также можете сделать ${PWD:t:s/trunk/latest/}.

Хотя он bashтакже поддерживает эти модификаторы истории csh для расширения истории, он не поддерживает их для расширений параметров.

Здесь с bashпомощью временной переменной:

var=${PWD##*/} var=${var//trunk/latest}
Стефан Шазелас
источник
3

Попробуйте это с помощью bash:

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

или одной командой:

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

Результат в ${BASH_REMATCH[1]}

Кир
источник
0

Вы хотите...?

PWD=latest

Я не вижу метода по вашему запросу. Если вы хотите заменить все $PWDw / последней - хотя лучший способ сделать это - cdдо последней.

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

... который приведет вас к последней версии и напечатает путь к stdout. Вы можете вернуться туда, откуда пришли, cd -снова выполнив . Вы можете сделать то же самое с $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
источник
Проблема заключается не в самой замене, ее можно решить sedза несколько шагов. Но я не понимаю, почему bash отказывается выполнять subshell, а затем заменяет его содержимое, как любую другую строку
yabuki_joe