Як використовувати bash вбудований для заміни результатів підпакеті або функції


9

Я намагаюся використовувати вбудовану підстрокову програму bash для заміни виводу підшлубку або іншої функції bash.

Наступні команди досить добре працюють в zsh; але призводить до bad substitutionпомилки в bash:

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

або

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

вихід має бути останньою папкою $PWD, заміненою на latestмою поточну каталогtrunk

так /home/user/trunkмає статиlatest

Чи є еквівалент bash, що дозволяє ланцюжкові видання рядків, не покладаючись на змінні чи труби? Або вбудовані файли bash дозволяють лише введенню бути рядковою чи простою змінною?

Відповіді:


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 / latest - хоча найкращий спосіб зробити це - 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

Питання полягає не в самій заміні, її можна досягти за sedкілька кроків. Але я не розумію, чому bash відмовляється виконувати підзаголовок, а потім замінити його вміст, як і будь-який інший рядок
yabuki_joe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.