回答:
あなたが探しているコマンドがある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
同じコマンドを使用して2つのディレクトリ間を行き来したい場合もありますが、これがシェル固有およびディストリビューション/カーネル固有であるかどうかはわかりません。
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
コマンドを使用して、現在スタックにあるもののリストを表示することもできます。
詳細な説明は、「pushdおよびpopdコマンドを使用するにはどうすればよいですか?」というタイトルのこの回答から見つけることができます。。
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
-style cd
履歴を提供できるようにするシェル関数です。単一のサブシェルを呼び出さずにすべての作業を実行します。その流れはかなり健全だと思います。中程度のテストですべてのケースを正しく処理するようです。
この関数は、完全に移植可能な構文に依拠しながら、環境をできるだけうまく再生しようとします。これは、1つの仮定のみを行い、$DIRSTACK
環境変数がそのプロパティであるということです。
格納するすべてのパスを正規$DIRSTACK
化し、それらをすべて単一引用符でシリアル化します-ただし、変数の値に追加する前にそれぞれが安全に引用され、シリアル化されていることを保証し、どんな種類の特殊文字にも問題がないはずです。$DIRSTACKMAX
環境変数が設定されている場合、履歴に保持するパスの数の上限として使用されます。それ以外の場合、制限は1です。
関数をロードする場合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
そこcd
にあるシェルから直接呼び出します。空の引数:label
のデフォルトターゲットを作成しますgoto
。
エイリアスの自動削除の実装は気にしませんでしたが、それ以外の場合は、少し変更した形でこれを使用しています。
http://fex.belwue.de/fstools/bash.htmlから「cd history」機能を使用できます。
これまでに行ったすべてのディレクトリが記憶され、「cdh」を使用すると、最後の9つのディレクトリのリストが表示されます。番号を入力するだけで、このディレクトリに戻ります。
例:
framstag @ wupp:/:cdh 1:/ usr / local / bin 2:/ var 3:/ / 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は「cdなしのcd」とも呼ばれるautocdで動作します。cdやpushdを入力する必要はありません。
拡張された「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
、ディレクトリはトップ位置に2回だけ移動します(または、位置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
可能な解決策としてfzfマークを追加したかっただけです。
インストールすると、ブックマークされたディレクトリを追加して検索するためのコマンドマークとジャンプが提供されます(はい、完全に履歴ではなく、自分でブックマークしたディレクトリだけです)。
pushd / popd itセッション固有の動作に関する問題、つまり、異なるbashセッションで同じスタックを使用したい、またはfzf-marksで可能な問題です。
@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
5 番目のディレクトリに戻ることができcd -h
ます。履歴の概要が表示されます。