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