Bash에서 tcsh dextract와 유사한 pushd 기능 얻기

Bash에서 tcsh dextract와 유사한 pushd 기능 얻기

나는 (4.1.2(1)-release)를 좋아 하지만 옵션이 활성화된 상태 로 구현하는 bash방식을 매우 선호 하므로 기본 셸로 사용하는 것을 거부합니다 . -like 디렉토리 스택 명령 세트를 구현한 사람이 있습니까 ? 아니면 활성화된 것처럼 동작하도록 동축하는 방법을 찾지 못했을 수도 있습니까 ?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(및 기본값 tcsh) 다른 모든 디렉토리의 위치를 ​​회전 합니까 pushd +1? 이것이 왜 유용한가요? (누군가 설명을 해준다면 그 동작에 감사하고 익숙해질 수도 있을 것입니다.) 단지 추출하여 맨 위에 놓는 tcshwith 와 비교해 보세요.dextract

% 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
}

관련 정보