`pushd .`와 `cd -` 사이의 충돌

`pushd .`와 `cd -` 사이의 충돌

cd -이전 디렉토리로 이동하는 명령을 사용하게 되어 기쁩니다 . 동시에 나는 또한 좋아 pushd .합니다 popd.

그러나 현재 작업 디렉토리를 기억하여 이 작업을 수행하려는 경우 pushd .이전 디렉토리로 이동하면 가능성을 잃게 됩니다 cd -. ( pushd .또한 실행됨 cd .).

pushd아직도 어떻게 사용할 수 있나요?cd -

참고: GNU bash, 버전 4.1.7(1)

답변1

다음과 같이 사용할 수 있습니다.

push() { 
    if [ "$1" = . ]; then
        old=$OLDPWD
        current=$PWD
        builtin pushd .
        cd "$old"
        cd "$current"
    else
        builtin pushd "$1"
    fi
}

이름을 지정하면 pushd함수가 내장보다 먼저 평가되므로 내장보다 우선합니다.

덮어쓰면 특별한 의미를 잃게 되므로 old변수 가 필요합니다 .currentOLDPWD

답변2

조금 더 간단한 버전보이텍의 답변:

pushd () {
        if [ "$1" = . ]; then
                cd -
                builtin pushd -
        else    
                builtin pushd "$1"
        fi      
}

함수에 이름을 붙이면 함수명을 기억하지 않아도 pushd정상적으로 사용할 수 있습니다 .pushd

답변3

케빈의 대답은 매우 좋습니다. 사람들이 문제를 해결하기 위해 스크립트가 필요한 이유를 더 잘 이해하고 싶어하는 경우를 대비하여 무슨 일이 일어나고 있는지에 대한 몇 가지 세부 정보를 작성했습니다.

CD와 디렉터리 스택이 작동하는 방식을 더 자세히 살펴보면 pushd .동작이 중단된 이유가 분명해집니다. cd -일부 디렉터리를 스택에 푸시해 보겠습니다.

$ mkdir dir1 dir2 dir3
$ pushd dir1
~/dir1 ~
$ pushd../dir2
~/dir2 ~/dir1 ~
$ pushd../dir3
~/dir3 ~/dir2 ~/dir1 ~
$ dirs -v
0       ~/dir3
1       ~/dir2
2       ~/dir1
3       ~

cd -이제 디렉터리로 다시 점프해 볼 수 있습니다 .

$ cd -
/home/username/dir2
$ dirs -v
0       ~/dir2
1       ~/dir2
2       ~/dir1
3       ~

cd -이전 디렉터리로 다시 점프하여 스택 ~0을 점프한 디렉터리로 대체한 것을 볼 수 있습니다 . 다시 되돌아갈 수 있습니다 cd -:

$ cd -
/home/username/dir3
$ dirs -v
0       ~/dir3
1       ~/dir2
2       ~/dir1
3       ~

이전 디렉터리가 실제로 디렉터리 스택에 나열되어 있지 않더라도 이전 디렉터리로 다시 이동합니다. 이는 이전 디렉터리를 추적하는 데 cd환경 변수가 사용되기 때문입니다 .$OLDPWD

$ echo $OLDPWD
/home/username/dir2 

이렇게 하면 pushd .현재 디렉터리의 추가 복사본을 스택에 푸시합니다.

$ pushd . 
~/dir3 ~/dir3 ~/dir2 ~/dir1 ~
$ dirs -v
0       ~/dir3
1       ~/dir3
2       ~/dir2
3       ~/dir1
4       ~

스택에 있는 현재 디렉터리의 추가 복사본을 만드는 것 외에도 pushd .다음이 업데이트되었습니다 $OLDPWD.

$echo $OLDPWD
/home/username/dir3

따라서 cd -유용한 기록이 손실되었으며 이제는 아무 작업도 수행하지 않고 현재 디렉터리로 이동합니다.

관련 정보