
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 -
...이렇게 하면 최신 버전으로 이동하고 경로 이름을 표준 출력으로 인쇄합니다. 다시 수행하면 이전 위치로 돌아갈 수 있습니다 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