나는 경로에 있는 스크립트의 디렉토리로 변경할 수 있는 작은 스크립트를 작성했습니다. 이는 원본 스크립트와 동일한 폴더에 있는 편집하고 싶은 다른 스크립트에 빠르게 액세스하는 데 도움이 됩니다.
나는 역사를 되돌아보고 명령 앞에 무엇이든 접두사를 붙이는 경향이 있습니다.
$ . 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