bash 내장을 사용하여 서브 쉘 또는 함수의 출력을 바꾸는 방법


9

bash 하위 문자열 내장을 사용하여 하위 쉘 또는 다른 bash 함수의 출력을 대체하려고합니다.

다음 명령은 zsh에서 잘 작동합니다. bad substitutionbash 에서 오류가 발생합니다.

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

또는

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

출력은 마지막 폴더 수 있어야 $PWD로 대체, latest내 현재 디렉토리 인 경우trunk

그래서 /home/user/trunk되어야한다latest

변수 또는 파이프에 의존하지 않고 문자열 버전을 체인화 할 수있는 bash와 동등한 것이 있습니까? 또는 bash 내장 기능은 입력이 문자열 또는 일반 변수 일 수 있습니까?

답변:


9

아니요, 대체 연산자의 중첩은 고유합니다 zsh.

with 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

귀하의 요청에 대한 방법을 찾지 못했습니다. $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

이 문제는 대체 자체에 있지는 않지만 sed몇 단계 만 거치면 달성 할 수 있습니다 . 그러나 나는 왜 배쉬가 서브 쉘 실행을 거부하는지 이해하지 못한다. 그리고 다른 문자열처럼 그것의 내용을 교체
하라
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.