답변:
찾고있는 명령은 pushd
및 popd
입니다.
당신의 실제 작업 예를 볼 수 pushd
와 popd
에서 여기를 .
mkdir /tmp/dir1
mkdir /tmp/dir2
mkdir /tmp/dir3
mkdir /tmp/dir4
cd /tmp/dir1
pushd .
cd /tmp/dir2
pushd .
cd /tmp/dir3
pushd .
cd /tmp/dir4
pushd .
dirs
/tmp/dir4 /tmp/dir4 /tmp/dir3 /tmp/dir2 /tmp/dir1
$OLDPWD
동일한 명령을 사용하여 두 디렉토리간에 앞뒤로 전환하려는 경우 도 있지만 쉘 특정 및 배포 / 커널 특정인지는 확실하지 않습니다.
OLDPWD
는 모든 POSIX 셸에 존재하지만이 질문을 넘어서는 방법을 묻는이 질문에는 쓸모가 없습니다 (이미 질문은 이미 cd -
지름길입니다 cd "$OLDPWD"
).
cd /tmp/dir1; pushd .
그냥 대신 사용하는 이유가 pushd /tmp/dir1
있습니까?
pushd /tmp/dir1
잘 작동합니다.
pushd
하고 실제 예제를 사용하여 답변을 향상 시키도록 제안하고 싶습니다 popd
. 당신의 대답은 이미 정답입니다.
사용중인 쉘을 지정하지 않았으므로 zsh를 광고 할 수 있습니다.
예, 우리는 더 많은 역사를 가지고 할 cd
즉 cd -2
, cd -4
등이 매우 편리합니다 cd -
TAB, 특히 완료 시스템 및 색상을 사용할 수 :
이것이 내가 .zshrc에있는 것입니다.
setopt AUTO_PUSHD # pushes the old directory onto the stack
setopt PUSHD_MINUS # exchange the meanings of '+' and '-'
setopt CDABLE_VARS # expand the expression (allows 'cd -2/tmp')
autoload -U compinit && compinit # load + start completion
zstyle ':completion:*:directory-stack' list-colors '=(#b) #([0-9]#)*( *)==95=38;5;12'
그리고 결과 :
bash
한 유효한 답변입니다. 제거하지 마십시오.
setopt AUTO_PUSHD
, 주식 zsh에서 완성 된 전 방향 디렉토리 스택을 얻는 데 위의 설정이 필요 하지 않다는 것을 언급 할 수 있습니다 . PUSHD_MINUS
반전의 의미 cd +
및 cd -
(기호의 문제)를 CDABLE_VARS
디렉토리 스택에 무관하고, zstyle
여기에 소정의 호출은 단순히 디렉토리 스택 완료의 출력에 착색 추가합니다. 그러나 완료 서브 시스템을로 초기화해야합니다 autoload -U compinit && compinit
.
"더 많은 역사"에 관한 질문에 대답합니다. cd -
Bash 의 기능은 "플립"할 수있는 단일 디렉토리 만 지원 하지 않습니다 . @Ramesh는 그의 대답에서 말합니다. 당신이 디렉토리의 긴 역사를 원하는 경우에 당신이 사용할 수있는 pushd
및 popd
디렉토리를 저장하거나 이전으로 돌아갑니다.
dirs
명령을 사용하여 현재 스택에있는 목록을 볼 수도 있습니다 .
이 답변에서 자세한 설명을 볼 수 있습니다. 푸시 및 팝 명령은 어떻게 사용합니까? .
bash 용 dirhistory 유틸리티를 설치하고 사용할 수 있습니다 .
기본적으로 모든 쉘에서 디렉토리 변경 사항을 수집하는 데몬이며 기록을 표시하고 전환 할 디렉토리를 선택할 수있는 Cdk 프로그램입니다 (따라서 스택에만 국한되지 않음).
당신은 당신이 원하는만큼 많은 역사를 가지고 있습니다 :
cd() {
[ "$((${DIRSTACKMAX##*[!0-9]*}0/10))" -gt 0 ] &&
set -- "$@" "$DIRSTACK" &&
DIRSTACK='pwd -P >&3; command cd' ||
{ command cd "$@"; return; }
_q() while case "$1" in (*\'*) : ;; (*)
! DIRSTACK="$DIRSTACK '$2$1'" ;;esac
do set -- "${1#*\'}" "$2${1%%\'*}'\''"
done
while [ "$#" -gt 1 ]
do case ${1:---} in (-|[!-]*|-*[!0-9]*) : ;;
(*) eval " set $((${1#-}+1))"' "${'"$#}\""
eval ' set -- "$2"'" $2"'
set -- "${'"$1"'}" "$1"'
;;esac; _q "$1"; shift
done
eval " DIRSTACK=; $DIRSTACK &&"'
_q "$OLDPWD" &&
DIRSTACK=$DIRSTACK\ $1
set "$?" "${DIRSTACK:=$1}"'" $1
" 3>/dev/null
[ "$(($#-1))" -gt "$DIRSTACKMAX" ] &&
DIRSTACK="${DIRSTACK% \'/*}"
unset -f _q; return "$1"
}
POSIX 호환 쉘이 zsh
스타일 cd
히스토리 를 제공 할 수있게하는 쉘 기능입니다 . 단일 서브 쉘을 호출하지 않고 모든 작업을 수행하며 흐름이 꽤 좋다고 생각합니다. 중간 테스트에서 모든 경우를 올바르게 처리하는 것 같습니다.
이 함수는 완전히 이식 가능한 구문에 의존하면서 환경과 마찬가지로 훌륭하게 재생하려고 시도합니다. 단 하나의 가정 만하고 $DIRSTACK
환경 변수는 그 속성과 관련이 있습니다.
그것은 저장하는 모든 경로를 정규화하고 $DIRSTACK
작은 따옴표로 모든 경로를 직렬화합니다. 그러나 변수의 값에 추가하기 전에 각각이 안전하게 인용되고 직렬화되도록 보장하며 어떤 종류의 특수 문자에도 문제가 없어야합니다 . $DIRSTACKMAX
환경 변수가 설정 되면이 변수는 히스토리에 보유하는 경로 수의 상한으로 사용되며, 그렇지 않은 경우 한도입니다.
함수를로드하면 cd
평상시와 같이 cd -[num]
변경 디렉토리 히스토리를 통해 다시 추적 할 수 있습니다.
함수의 주요 메커니즘은 cd
그 자체이며 ${OLD,}PWD
환경 변수입니다. POSIX cd
는 모든 경로 이동에 대해 이들을 변경하도록 지정 하므로 쉘의 내장 변수 만 사용하고 원하는만큼 값을 저장합니다.
acd_func.sh의 스크립트는 설명 정확히 않습니다. 기본적으로 cd
함수에 과부하가 걸리고 입력 cd --
하여 이전에 방문한 디렉토리의 목록을 가져 와서 번호로 선택할 수 있습니다. 더 이상 이것을 사용하지 않고 bash를 사용하는 것이 매우 어렵다는 것을 알게되었습니다. 새로운 시스템에 가장 먼저 설치했습니다.
다른 사람들은 이미 몇 가지 흥미로운 해결책을 다루었습니다. 얼마 전에 나는 "똑 바른 역사"를 수행하기 위해 신속하게 수정할 수있는 관련 문제에 대한 자체 솔루션을 만들었습니다. 기본적으로 자주 사용되는 디렉토리 몇 개를 "레이블"하고 모든 열린 셸에서 해당 디렉토리 를보고 재부팅 할 때까지 계속 유지하려고했습니다.
#dir_labels
#functions to load and retrieve list of dir aliases
function goto_complete {
unset dir_labels
declare -A dir_labels
{
while read line; do
ll_pre="${line%% *}"
ll_dir="${line#* }"
dir_labels["$ll_pre"]="$ll_dir"
done
} < ~/.dir_labels
unset ll_pre
unset ll_dir
local cur possib
cur="${COMP_WORDS[COMP_CWORD]}"
possib="${!dir_labels[@]}"
COMPREPLY=( $(compgen -W "${possib}" -- ${cur}) )
}
complete -F goto_complete goto
function goto {
unset dir_labels
declare -A dir_labels
{
while read line; do
ll_pre="${line%% *}"
ll_dir="${line#* }"
dir_labels["$ll_pre"]="$ll_dir"
done
} < ~/.dir_labels
unset ll_pre
unset ll_dir
if [ $# -gt 0 ]; then
key="$1"
else
key=default
fi
target="${dir_labels[$key]}"
if [ -d "$target" ]; then
cd "$target"
echo "goto $key: '$target'"
else
echo "directory '$target' does not exist"
fi
}
function label {
unset dir_labels
declare -A dir_labels
{
while read line; do
ll_pre="${line%% *}"
ll_dir="${line#* }"
dir_labels["$ll_pre"]="$ll_dir"
done
} < ~/.dir_labels
unset ll_pre
unset ll_dir
if [ $# -gt 0 ]; then
target="$1"
else
target="default"
fi
dir_labels["$target"]=$PWD
for i in "${!dir_labels[@]}"; do
echo "$i ${dir_labels[$i]}"
done > ~/.dir_labels
}
기본적으로 난 그냥 할 거라고 label foo
현재 디렉토리를 호출 foo
, 쉘 어떤에서 다음과 goto foo
whould cd
직접이. 빈 인수 :에 label
대한 기본 대상을 만듭니다 goto
.
별칭의 자동 제거를 구현하지 않았지만 여전히 약간 수정 된 형태로 사용하고 있습니다.
http://fex.belwue.de/fstools/bash.html 에서 "cd history"기능을 사용할 수 있습니다
그것은 당신이 있었던 모든 디렉토리를 기억하고 "cdh"와 함께 당신은 마지막 9 개의 디렉토리의 목록을 보게 될 것입니다. 번호를 입력하면이 디렉토리로 돌아갑니다.
예:
framstag @ wupp : / : cdh 1 : / usr / local / bin 2 : / var 삼: / 4 : / tmp / 135_pana / 1280 5 : / tmp / 135_pana 6 : / tmp / weihnachtsfeier 7 : / tmp 8 : / local / home / framstag 선택 : 4 framstag @ wupp : / tmp / 135_pana / 1280 :
cdh는 autocd 일명 "cd without cd"와 함께 작동합니다. cd를 입력하거나 누를 필요가 없습니다.
확장 된 'cd'기능을 추천하고 싶습니다.
생활을보다 쉽게하기 위해 다음과 같은 기능을 제공합니다.
에 대한 bash는 , 기본적으로 : 대신 CD 사용을 사용하는 pushd
사람들이 저장되도록 변경 directorys에 (스택 의미)
pushd /home; pushd /var; pushd log
dirs
"스택 항목"의 수를 얻기 위해 스택 사용 및보다 쉬운 탐색을 보려면 다음을 사용하십시오.
dirs -v
산출:
me@myhost:/home$ dirs -v
0 /home
1 /var
2 /tmp
이제이 숫자들을 다음 cd
과 ~
같이 사용하십시오 :
cd ~1
그러나 이제 이러한 숫자가 재 배열되고 "0"위치가 변경되므로 다음과 pushd
같이 디렉토리를 최상위 위치로 두 번 (또는 0 위치에서 더미 사용)하십시오.
me@myhost:/home$ dirs -v
0 /home
1 /home
2 /var
3 /tmp
지금 1..3은 내가 어딘가에 읽었지만 더 이상 알지 못하는 입장을 유지 합니다.
(스택에서 현재 디렉토리를 릴리스 / 히스토리 사용에서 삭제 popd
)
312 페이지의 "쉘 프로그래밍, 4e"의 cdh 함수를 참조하십시오. 히스토리를 배열로 유지합니다.
고급 버전은 다음과 같습니다. https://drive.google.com/open?id=0B4f-lR6inxQWQ1pPZVpUQ3FSZ2M
기록을 CDHISTFILE 파일에 저장하고 문자열을 포함하는 최신 디렉토리로 변경할 수 있습니다.
cd -src
기존 cd 명령을 통해 자체적으로 설치됩니다. alias cd=_cd
@ mikeserv가 제공 한 답변을 시도했지만 제대로 작동하지 않았습니다. 나는 그것을 고치는 방법을 알 수 없었기 때문에 방금 내 자신을 썼다.
cd() {
# Set the current directory to the 0th history item
cd_history[0]=$PWD
if [[ $1 == -h ]]; then
for i in ${!cd_history[@]}; do
echo $i: "${cd_history[$i]}"
done
return
elif [[ $1 =~ ^-[0-9]+ ]]; then
builtin cd "${cd_history[${1//-}]}" || # Remove the argument's dash
return
else
builtin cd "$@" || return # Bail if cd fails
fi
# cd_history = ["", $OLDPWD, cd_history[1:]]
cd_history=("" "$OLDPWD" "${cd_history[@]:1:${#cd_history[@]}}")
}
이것은 GitHub Gist 로도 제공됩니다 . 이 기능을 사용하려면 함수를 .bashrc
비슷한 곳에 붙여 넣으면 마지막 cd -5
다섯 번째 디렉토리 로 돌아가는 것과 같은 작업을 수행 할 수 있습니다 . cd -h
이력에 대한 개요를 제공합니다.