Bash의 tcsh dextract와 유사한 Pushd 기능을 사용하세요.

Bash의 tcsh dextract와 유사한 Pushd 기능을 사용하세요.

bash나는 (4.1.2(1)-release)를 좋아하지만 해당 옵션을 활성화하는 방식이 너무 좋아서 기본 셸로 사용하기를 거부합니다. 디렉토리 스택과 같은 명령 세트를 구현한 사람이 있습니까? 아니면 활성화처럼 작동하도록 속이는 방법을 찾지 못했을 수도 있습니다.tcshpushd +Ndextractbashdextractbashbashtcshdextract

요점은 bash다음과 pushd +N같습니다.

$ cd /tmp
$ pushd a
/tmp/a /tmp
$ pushd ../b
/tmp/b /tmp/a /tmp
$ pushd ../c
/tmp/c /tmp/b /tmp/a /tmp
$ pushd +1
/tmp/b /tmp/a /tmp /tmp/c

을 수행할 때 다른 모든 디렉토리의 위치가 bash기본적으로 회전되는 이유는 무엇입니까 ? 이것이 작동하는 이유는 무엇입니까? (어쩌면 누군가 설명하면 이 동작에 감사하고 익숙해질 수도 있습니다.) 그냥 추출하여 맨 위에 놓는 with 와 비교하면 다음과 같습니다 .tcshpushd +1tcshdextract

% set dextract
% cd /tmp
% pushd a
/tmp/a /tmp 
% pushd ../b
/tmp/b /tmp/a /tmp 
% pushd ../c
/tmp/c /tmp/b /tmp/a /tmp 
% pushd +1
/tmp/b /tmp/c /tmp/a /tmp 

나머지 디렉토리 순서는 변경되지 않습니다. 주문이 순환되지 않을 때 머릿속으로 추적하는 것이 더 쉽기 때문에 항상 dirs원하는 카탈로그를 실행하고 검색할 필요가 없기 때문에 이것이 중요하다고 생각합니다.

한번 시도해본다면 어디서부터 시작해야 할까요? 변수가 있는 것을 확인했지만 DIRSTACK, 변수를 변경하면 스택이 변경되지만(비록 부정확하긴 하지만) 올바르지 않습니다(스택에 항목이 4개 있으면 비어 있음).

답변1

약간의 작업과 영감을 얻은 후에 문제를 해결했습니다.

# dextract-like pushd -- push $1'st directory to top of stack and shift rest down
function pushd {
    local t
    if [[ $1 =~ ^[-+]?[0-9]+$ ]]; then
        pos=$1
        [[ ${pos} -lt 0 ]] && ((pos=${#DIRSTACK[@]}+${pos}))
        if [[ ${pos} -gt 0 && ${pos} -lt ${#DIRSTACK[@]} ]]; then
            t="${DIRSTACK[$pos]}"
            # This is crufty. You can't put ~ in DIRSTACK, except the
            # shell will put it into position zero when it refers to your
            # own directory (not anyone else's!). So replace any occurrences.
            DIRSTACK=("" "${DIRSTACK[0]/#~/${HOME}}" "${DIRSTACK[@]:1:${pos}-1}" "${DIRSTACK[@]:${pos}+1}")
            cd "$t"
            builtin dirs -v
        else
            echo "$0: pushd: $1: directory stack index out of range" 1>&2
        fi
    else
        builtin pushd "$@" >/dev/null || return
        cd .
        builtin dirs -v
    fi
}

관련 정보