
次のエイリアスを使用することをお勧めします。
cd() {
pushd $1;
}
バッシュから?
popd
1つだけを使用するのではなく、一連のsを使用できるので、これは非常に便利だと思いますcd -
。
問題が発生する可能性がある状況はありますか?
答え1
個人的には、私はbashrcに次のものを持っており、常に使用しています。
pushd()
{
if [ $# -eq 0 ]; then
DIR="${HOME}"
else
DIR="$1"
fi
builtin pushd "${DIR}" > /dev/null
echo -n "DIRSTACK: "
dirs
}
pushd_builtin()
{
builtin pushd > /dev/null
echo -n "DIRSTACK: "
dirs
}
popd()
{
builtin popd > /dev/null
echo -n "DIRSTACK: "
dirs
}
alias cd='pushd'
alias back='popd'
alias flip='pushd_builtin'
その後、ブラウザのようにコマンドラインをナビゲートできます。cd
ディレクトリを変更します。back
以前にcd
編集したディレクトリに移動します。flip
現在のディレクトリと前のディレクトリの間をディレクトリスタックから取り出すことなく移動します。全体的に見事に動作します。
私が知っている唯一の実際の問題は、これが私に完全に慣れていますが、他の人のコンピュータには存在しない一連の命令であるということです。したがって、他の人のコンピュータを使用する必要がある場合は、少し面倒なことがあります。pushd
そして直接使用に慣れている場合、popd
この問題は発生しません。エイリアスcd
を入れずにエイリアスを指定すると、存在しない問題は発生しませんが、popd
他のコンピュータでは目的の効果が得られないという問題が引き続き発生しますback
。cd
しかし、あなたの特定の実装は、一般自体がホームディレクトリに移動するcd
ように正確には機能しませんが、あなたの実装はそうではないことを指摘したいと思います。ここにあるバージョンにはこの問題はありません。私も印刷物の前に追加されますが、これは個人的な好みの問題です。cd
cd
DIRSTACK
dirs
だから私が言ったように、私はいつもこれらのエイリアスを使用しており、問題はありません。他の機械を使用する必要がありますが、そこにいないことがわかると、少しがっかりする可能性があります。 (驚くべきことではありませんが、あまりにも頻繁に使用して考えることができないマシンの1つです。)それでも驚くことができます。
答え2
これは質問に対する直接的な答えではありませんが、4DOSのディレクトリ履歴ウィンドウに反対しました。私はLinux(およびCygwin)用のバージョンを直接作成しました。私はそれをインストールするのは簡単なユーティリティにはできませんでしたが、Bashプロンプトの方法を知っている場合はそうしないでください。それ走りにくいです。あなたの質問に触発され、これをGitリポジトリに入れてGitHubにアップロードしました。ディレクトリ履歴。
デフォルトでは、これはすべてのシェルでディレクトリの変更を収集するデーモンであり、履歴を表示し、切り替えたいディレクトリを選択できるようにするCdkプログラムです(スタックに限定されません)。私はそれが非常に便利であることを知り、4DOSのようにCtrl-PageUpに接続しました。 (私はCtrl-PageUpをBashに送信するようにPuTTYにパッチを付けました。)
答え3
私にとっては pushd/popd/dirs はほとんど役に立ちましたが、欠けています。だから私は基本的に20のエイリアスセットで実装された「navd」という「ラッパー」を作成しました。 (そのうちの1つは実際には関数です。)コードは次のとおりですが、最初に簡単な説明をします。 (「navd」を他の人のコンピュータで作業するときに得られる利点の1つは、「インストールせずに」実行できることです。)インストールオプションでbashプロンプトに「navd」を実装するコマンドを貼り付けるマシンの bash セッション中、navd はファイルシステムにスペースを提供しませんが、これは一時的なインストールであるため、「実際の」インストール (プロセス) のためにこれらのコマンドを .bashrc に入れます。
特徴:
navd <path>; -- will make that path the current dir AND will add it to the stack
AS A BONUS: If a relative path is used, this command is added to history
with an absolute path instead. This improves navigation even when only
using history ... because very often relative-path commands in history
are useless if the command changes the current directory. (After all, you
would have to be in the directory the command was originally issued
from in order for such a command to work correctly.)
navd -- shows the stack, with index numbers for convenience
navd0 -- makes the first entry on the stack (read left-to-right) **the current dir**
navd1 -- makes the second entry on the stack (read left-to-right) **the current dir**
.
.
.
navd9 -- makes the tenth entry on the stack (read left-to-right) **the current dir**
navd-1 -- makes the first entry on the stack WHEN READ RIGHT-to-LEFT(!) **the current dir**
. ^^^^^^^^^^^^^^^^^^^^^^^^^^
.
.
navd-9 -- makes the 9th entry on the stack WHEN READ RIGHT-to-LEFT(!) **the current dir**
19個のnavd <N>コマンドの1つスタックの回転このディレクトリが現在のディレクトリになります。返品これでスタックの先頭に表示されます。正の <N> の値は、インデックスが 0 から始まり、左から数えるディレクトリを探します。負の <N> 値は、-1 から始まるインデックスを使用して右から数えるディレクトリを検索します。 (これは、Javaや他の言語で配列インデックスを使用する方法の規則に従います。)
注:すべての「navd」コマンドは、「pushd」と「dirs」で使用されているのと同じスタックを表示しますが、なしで表示します。 一番左のアイテム"dirs"が表示されます(アイテムが実際にスタックにないため - 現在のディレクトリです)。 そして「dirs」で一番左のアイテムcdコマンドを入力すると変更されます。) ( "cd <path>"コマンドはnavdの動作には影響しません。)行動に影響を与えたが、プッシュ/ディレクトリ/ポップd。また...私は"return"のために"cd -"を使うのが好きです。一度先ほどナビゲートしたディレクトリに移動し、「cd -」はnavdの動作には影響しません。 )
ボーナス:スタックを回転せずにdirをスタックに表示されている位置に変更する19の別名があります。
nav0 ... nav9 and nav-1 ... nav-9
2番目のボーナス:「navh」は履歴にnavd <path>コマンドを表示するため、切り取り - 貼り付けを使用してスタックを簡単にロードできます。 (各アイテムは履歴に複数回表示されても一度だけリストされ、リストがソートされます。また、そのアイテムがnavhリストに表示されないように、$ HOME / .navhignoreファイルにアイテムを配置できます。)
navh
3つの主な行動:
スタックをクリアして特定の「navd <path>」コマンドを繰り返すと、パスがスタックに保存されます。それが私が望んで期待するものです...しかし、Pushdはそうしません。現在探しているディレクトリをスタックに入れます。したがって、コマンドを繰り返すとスタックへの影響は可変です(予測できないように感じます)。
"navd <path>" は同じパスをスタックに 2 回は入れません。
「navd<path>」はコマンド履歴に含まれます。純粋なパスの偶数比較的コマンドのパスを入力します。
私に説明されている最後の3つの動作は、レコードで "pushd <path>"コマンドを使用するよりも、レコードで "navd <path>"コマンドを使用する方が便利です。私は本当にできる履歴を再利用して別の場所に移動してください。これによりスタックが「壊れない」ことはありません。
これを最大限に活用したい場合は、navdとPushd / dirs / popdの使用を切り替えることができます。どちらも同じスタックを使用します。ただスタイルが違うだけです。たとえば、「navd」スタックからコンテンツを削除するには「popd」を使用し、navdスタックを消去するには「dirs -c」を使用します。
Pushd/dirs/popdを「私のステップをどのように元に戻すことができますか?」と考えてください。
navdを「お気に入りのディレクトリセットを維持し、ディレクトリ間で簡単に切り替えるにはどうすればよいですか?」と考えてください。
次をターミナルウィンドウに貼り付けると、そのターミナルセッション中にnavdの使用をすぐに開始できます。これがこの関数のすべてのコードです。
# Add 1 function and many related aliases for something like "pushd", called "navd". http://unix.stackexchange.com/a/229161
# Think of pushd/dirs/popd as "how do I retrace my steps?".
# Think of navd as "how do I hold on to a set of favorite directories, and easily switch between them?".
# Pseudo-code to explain each part of the "navd" bash function just below:
# If no arguments to the 'navd' command:
# If stack has entries, then print the stack one-line-per-dir with each line numbered.
# Else, if stack is empty, automatically run the equivalent of the navh command.
# Else (there **are** arguments to the 'navd' command):
# If arg is '--help' or '/?' then show help.
# Else (arg is assumed to be a path to a directory)
# Remember the directory we are starting at
# Change to dir given as argument (the "arg-dir"), and do a few chores:
# Do not use arg-dir literally ... instead, magically put the **absolute** path we arrived at into history.
# Set a flag if the arg-dir is already in the stack.
# If the flag is set then just show the stack (on one line), else ADD to stack, ROTATE to end-of-stack, and show the stack.
# Change to dir we started at and then back to the arg-dir. This allows "cd -" to go back to dir we started at.
# End-If
# End-If
navd () {
if [[ $1 == '' ]]; then #--no arguments to the 'navd' command
if dirs +1 >/dev/null 2>&1; then #------stack has entries
dirs -p | perl -ne 'print (-1+$cn++); print "$_"' | grep -v "^-1";
else #------stack is empty
echo "The navd stack is empty. Now running 'navh' in case that's helpful. navd --help works."
if [[ ! -f $HOME/.navhignore ]]; then echo -n ''>>$HOME/.navhignore;fi;diff --new-line-format="" --unchanged-line-format="" <(history | perl -ne "if (m/^\s*\d+\s+navd [\"~.\/]/) {s/^\s*\d+\s+/ /;s/\/$//;print}" | sort -u) <(cat $HOME/.navhignore | sort -u);echo "cat $HOME/.navhignore # (Has "`grep -c . <(sort -u $HOME/.navhignore)`" unique lines.)"
fi
else #--(there **are** arguments to the 'navd' command)
if [[ $1 == '--help' || $1 == '/?' ]]; then #------arg is '--help' or '/?'
echo "The 'navd' functionality is nothing but one bash function and a set of aliases."
echo "It offers a different style of handy directory navigation than pushd/popd."
echo "It uses the same 'stack' as pushd. Look in the .bashrc file for details."
echo " (Think of pushd/dirs/popd as 'how do I retrace my steps?'."
echo " Think of navd as 'how do I remember a set of favorite directories,"
echo " and easily switch between them?'.)"
echo "As of 10/2015, this link has more info: http://unix.stackexchange.com/a/229161"
echo "Here is the set of navd-related aliases. None need any parameter:"
alias | grep 'alias nav' | cut -d= -f1 | grep -v '-' | grep -v 'navh'
alias | grep 'alias nav' | cut -d= -f1 | grep '-'
echo "alias navh # The 'navh' alias has nothing to display until a 'navd <path>' is run. Short for nav-history."
echo "---- To get started, simpy type navd followed by your favorite path. ----"
echo "---- navd with no param shows stack. nav0 navigates to first on stack. ----"
else #------(arg is assumed to be a path to a directory)
mypwd="$PWD"
cd "$1" >/dev/null;
history -s `echo "$PWD" | perl -pe 's/$ENV{'HOME'}/~/;s/ /\\\\ /g;s/^/navd /'`
myflag=`dirs -p | perl -pe 's/\n/:/' | perl -ne '@a=split(":");$pwd=shift(@a);$flag=0;foreach (@a) {if ($_ eq $pwd) {$flag=1}};print $flag'`
if [[ $myflag == 1 ]]; then dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"; else pushd .>/dev/null; pushd +1>/dev/null; dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"; fi
cd "$mypwd"; cd "`dirs -l -0`"
fi
fi
};
# Aliases for navigating and rotating the "pushd" stack in the style of "navd":
alias navd0='cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"' # "-l" is dash-L, and expands "~" to denote the home dir. Needed inside back-ticks.
alias navd1='cd "`dirs -l +1`";pushd -n +1;cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd2='myd=$PWD;cd "`dirs -l +1`";for i in {1..2};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd3='myd=$PWD;cd "`dirs -l +1`";for i in {1..3};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd4='myd=$PWD;cd "`dirs -l +1`";for i in {1..4};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd5='myd=$PWD;cd "`dirs -l +1`";for i in {1..5};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd6='myd=$PWD;cd "`dirs -l +1`";for i in {1..6};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd7='myd=$PWD;cd "`dirs -l +1`";for i in {1..7};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd8='myd=$PWD;cd "`dirs -l +1`";for i in {1..8};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd9='myd=$PWD;cd "`dirs -l +1`";for i in {1..9};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-1='cd "`dirs -l -0`";pushd -n -0>/dev/null; dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-2='myd=$PWD;cd "`dirs -l -0`";pushd -n -0>/dev/null;cd "`dirs -l -0`";pushd -n -0>/dev/null;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-3='myd=$PWD;cd "`dirs -l -0`";for i in {1..3};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-4='myd=$PWD;cd "`dirs -l -0`";for i in {1..4};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-5='myd=$PWD;cd "`dirs -l -0`";for i in {1..5};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-6='myd=$PWD;cd "`dirs -l -0`";for i in {1..6};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-7='myd=$PWD;cd "`dirs -l -0`";for i in {1..7};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-8='myd=$PWD;cd "`dirs -l -0`";for i in {1..8};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-9='myd=$PWD;cd "`dirs -l -0`";for i in {1..9};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
# BONUS commands (beyond the 20). Aliases for navigating but NOT rotating the "navd" stack:
# Help in remembering: "navd<#>" does more since it both changes the PWD and rotates the stack, whereas "nav<#>" does less
# (and has one letter less) since "nav<#>" only changes the PWD. Also "navd<#>" acts like the pushd-related command: dirs
# There is no "nav" command (with no number) so that there will be no conflict if any program called "nav" is used.
alias nav0='cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav1='cd "`dirs -l +2`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav2='cd "`dirs -l +3`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav3='cd "`dirs -l +4`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav4='cd "`dirs -l +5`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav5='cd "`dirs -l +6`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav6='cd "`dirs -l +7`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav7='cd "`dirs -l +8`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav8='cd "`dirs -l +9`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav9='cd "`dirs -l +10`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-1='cd "`dirs -l -0`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-2='cd "`dirs -l -1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-3='cd "`dirs -l -2`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-4='cd "`dirs -l -3`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-5='cd "`dirs -l -4`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-6='cd "`dirs -l -5`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-7='cd "`dirs -l -6`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-8='cd "`dirs -l -7`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-9='cd "`dirs -l -8`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
# BONUS command (beyond the 20). Alias for showing 'history' of all navd commands that add to the stack.
# Can be used in a new terminal session to quickly add recently used dirs to the navd stack.
alias navh='if [[ ! -f $HOME/.navhignore ]]; then echo -n ''>>$HOME/.navhignore;fi;diff --new-line-format="" --unchanged-line-format="" <(history | perl -ne "if (m/^\s*\d+\s+navd [\"~.\/]/) {s/^\s*\d+\s+/ /;s/\/$//;print}" | sort -u) <(cat $HOME/.navhignore | sort -u);echo "cat $HOME/.navhignore # (Has "`grep -c . <(sort -u $HOME/.navhignore)`" unique lines.)"'
# Note: When 'navd <relative-path>' is used, then by bash-magic the navd command puts 'navd <absolute-path>' into history,
# instead. This allows the output of "navh" to be useful regardless of the directory that is current when it is run.
#
# BONUS commands (beyond the 20). An even shorter alias for navd. An even shorter alias for navh.
alias nd='navd'
alias nh='if [[ ! -f $HOME/.navhignore ]]; then echo -n "">>$HOME/.navhignore;fi;diff --new-line-format="" --unchanged-line-format="" <(history | perl -ne "if (m/^\s*\d+\s+navd [\"~.\/]/) {s/^\s*\d+\s+/ /;s/\/$//;print}" | sort -u) <(cat $HOME/.navhignore | sort -u);echo "cat $HOME/.navhignore # (Has "`grep -c . <(sort -u $HOME/.navhignore)`" unique lines.)"'
これらのエイリアスは「bash」コマンドに基づいています。 「cd -」の正常な動作を維持するには特別な注意が必要です。 (私はPushdやnavdの代わりに「cd -」を使用することがよくあります。なぜなら、「cd -」はユーザーが持っていた最後の「場所」に戻るか、2つの場所を切り替えるのに非常に便利です)。 、インストールは必要ありません)。
もちろん、これらのコマンドを.bashrcファイルに入れてより永久にインストールすることもできます。
答え4
あなたが好きなもう一つの解決策があります。 @cjmのソリューションを使ってこの記事を書いています。 dirsの出力からncursesタイプメニューを生成するためにダイアログコマンドを使用します。項目を選択すると、そのディレクトリがスタックの一番上に移動され、そのディレクトリに入ります。ディレクトリ履歴と比較すると、これは各端末エミュレータに独自のディレクトリ履歴バッファを提供する利点があり、インストールが少し簡単です。
インストール:CDエイリアスをPushdに設定し、ダイアログボックスをインストールしてからbashrcにこの機能を挿入します。
dirmenu(){
dirIter=$(dialog --backtitle 'dirmenu' --clear --cancel-label "Exit" --menu "Please select:" 0 0 0 $(dirs) 3>&2 2>&1 1>&3)
cmd="builtin cd ~$dirIter"
eval $cmd
}
私はdirs -vを実行してから別のコマンドを実行して、目的のディレクトリにpopまたはcdするよりもこの方法を好みます。ダイアログメニューは、対応するダイアログで高度にカスタマイズすることもできます。
したがって、あなたの質問に答えるために、はい、PushdをCDにエイリアスとして割り当てるのは良い考えだと思います。定期的に(少なくとも更新のために)コンピュータを再起動すると、バッファオーバーフローの問題が発生する可能性が低くなります。スクリプトを作成するときにcdを使用するには注意が必要ですが、whileループでcdを使用するとバッファオーバーフローの問題が発生する可能性があります。 dirs / pushdバッファサイズを制御するものが何であるかわかりません。