
Bash 매개변수 확장을 사용하여 명령 대체 또는 다른 매개변수 확장의 출력을 수정하려고 합니다.
다음 중첩 확장은 Zsh에서 매우 잘 작동합니다. 그러나 Bash에서는 "잘못된 대체" 오류가 발생합니다.
${${PWD##*/}//trunk/latest}
또는
${$(basename $PWD)//trunk/latest}
출력은 의 마지막 폴더여야 하며 , 현재 디렉터리가 다음과 같을 때로 $PWD
대체되어야 합니다.latest
trunk
그렇게 /home/user/trunk
되어야 한다latest
변수나 파이프에 의존하지 않고 체인 확장을 허용하는 Bash와 동등한 기능이 있습니까? 아니면 Bash 확장에서는 입력이 문자열이나 일반 변수만 허용됩니까?
답변1
아니요, 대체 연산자의 중첩은 에 고유합니다 zsh
.
zsh
like with 를 사용하면 을 (t)csh
수행할 수도 있습니다 ${PWD:t:s/trunk/latest/}
.
기록 확장을 위해 csh 기록 수정자를 지원 하지만 bash
매개변수 확장을 위해서는 지원하지 않습니다.
여기서는 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
가장 좋은 방법은 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