명령 끝의 파이프를 무시하고 비밀번호를 변경하는 스크립트를 받으시겠습니까?

명령 끝의 파이프를 무시하고 비밀번호를 변경하는 스크립트를 받으시겠습니까?

나는 경로에 있는 스크립트의 디렉토리로 변경할 수 있는 작은 스크립트를 작성했습니다. 이는 원본 스크립트와 동일한 폴더에 있는 편집하고 싶은 다른 스크립트에 빠르게 액세스하는 데 도움이 됩니다.

나는 역사를 되돌아보고 명령 앞에 무엇이든 접두사를 붙이는 경향이 있습니다.

$ . cdbin my_super_script

이것은 대부분의 경우 작동합니다. 그러나 제가 실행한 마지막 명령이 어딘가에 파이프될 때는 작동하지 않습니다.

예를 들어

# if my last command was the following
$ my_super_script | grep -v bad | grep good

# then when I try and run my cdbin script using history, it looks like this
$ . cdbin my_super_script | grep -v bad | grep good

그러면 아무 작업도 수행되지 않습니다. 오류도 발생하지 않고 현재 디렉터리에 그대로 남아 있습니다.

내 간단한 cdbin스크립트는 다음과 같습니다.

CDBIN

PROG=$(which "$1")
DIR=$(dirname "$PROG")
cd "$DIR" 

편집: 예를 들어 다음과 같이 간단히 입력하면 이 문제를 피할 수 있다는 것을 대부분 알고 있지만 $ . cdbin !:0입력하기가 약간 어색합니다. :D

답변1

파이프를 사용하여 이 프로그램을 실행하면,귀하의 . cdbin명령은 서브 쉘에서 실행됩니다:따라서 서브쉘의 디렉토리가 변경되고 서브쉘이 닫히면 효과가 사라집니다.

이를 방지하려면주문하다이전에 이것을 실행한 적이 있으며 기록을 사용하십시오.

. cdbin !!:0

이것은 것이다이전 명령의 첫 단어 추출, 따라서 귀하의 시나리오에서는 다음과 같이 끝납니다.

. cdbin my_super_script

fc다음 명령을 사용하여 이전 명령을 추출할 수 있습니다 .

. cdbin $(fc -l -1 | awk '{print $2}')

cdbin예를 들어 인수 없이 호출되는 경우 사용하기 쉽게 별칭으로 변환하거나 그 자체의 일부로 만들 수 있습니다 .

CMD=${1:-$(fc -l -1 | awk '{print $2}')}
PROG=$(which "$CMD")
DIR=$(dirname "$PROG")

cd "$DIR" 

unset CMD PROG DIR

관련 정보