
Я пытаюсь использовать расширения параметров Bash для изменения вывода подстановки команды или другого расширения параметра.
Следующие вложенные расширения работают достаточно хорошо в Zsh, но приводят к ошибке «плохой подстановки» в Bash:
${${PWD##*/}//trunk/latest}
или
${$(basename $PWD)//trunk/latest}
вывод должен быть последней папкой $PWD
, замененной на , latest
когда мой текущий каталогtrunk
так /home/user/trunk
должно статьlatest
Есть ли эквивалент Bash, позволяющий объединять расширения без использования переменных или каналов? Или расширения Bash допускают только ввод строки или простой переменной?
решение1
Нет, такое вложение операторов подстановки уникально для zsh
.
Обратите внимание, что с помощью , zsh
как и с (t)csh
, вы также можете сделать ${PWD:t:s/trunk/latest/}
.
Хотя он bash
также поддерживает модификаторы истории csh для расширения истории, он не поддерживает их для расширения параметров.
Здесь с помощью bash
используйте временную переменную:
var=${PWD##*/} var=${var//trunk/latest}
решение2
Попробуйте это с bash:
[[ $PWD =~ .*/(.*) ]] && echo "${BASH_REMATCH[1]//trunk/latest}"
или одной командой:
[[ $PWD =~ .*/(.*) && ${BASH_REMATCH[1]//trunk/latest} =~ (.*) ]]
Результат в${BASH_REMATCH[1]}
решение3
Вы хотите...?
PWD=latest
Я не вижу метода для вашего запроса. Если вы хотите заменить все $PWD
w/ latest - хотя лучший способ сделать это - to cd
latest.
[ /home/user/trunk = "$PWD" ] && OLDPWD=../latest cd -
...что перенесет вас к latest и выведет имя пути на stdout. Вы можете вернуться туда, откуда пришли, выполнив команду cd -
again. Вы можете сделать то же самое с помощью $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