bash
나는 (4.1.2(1)-release)를 좋아하지만 해당 옵션을 활성화하는 방식이 너무 좋아서 기본 셸로 사용하기를 거부합니다. 디렉토리 스택과 같은 명령 세트를 구현한 사람이 있습니까? 아니면 활성화처럼 작동하도록 속이는 방법을 찾지 못했을 수도 있습니다.tcsh
pushd +N
dextract
bash
dextract
bash
bash
tcsh
dextract
요점은 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 와 비교하면 다음과 같습니다 .tcsh
pushd +1
tcsh
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
}