次のエイリアスを使用することをお勧めします:
cd() {
pushd $1;
}
バッシュ?
一度popd
だけではなく一連のsを使用できるため、これは非常に便利だと思いますcd -
。
これが問題になる場合はありますか?
pd
?システムの唯一のユーザーおよび管理者ですか?
autopushd
次のエイリアスを使用することをお勧めします:
cd() {
pushd $1;
}
バッシュ?
一度popd
だけではなく一連のsを使用できるため、これは非常に便利だと思いますcd -
。
これが問題になる場合はありますか?
pd
?システムの唯一のユーザーおよび管理者ですか?
autopushd
回答:
個人的には、これらを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
put putをエイリアスする場合popd
、back
存在cd
しないという問題は発生しませんが、他のマシンでは期待どおりの結果が得られないという問題が発生します。
ただし、特定の実装は、通常の方法ではホームディレクトリに移動するのとcd
同じようcd
に機能しますが、そうではないことに注意してくださいcd
。私がここに持っているバージョンには、その問題はありません。私もプリントアウトのDIRSTACK
前面に追加しますが、dirs
それは何よりも個人的な好みの問題です。
したがって、私が言ったように、私はこれらのエイリアスを常に使用し、それらに問題はありません。別のマシンを使用し、そこにいないことを見つけなければならないのは少しイライラする可能性があるだけです(驚くべきことではありませんが、彼らはあなたが頻繁に使用するものの1つであり、あなたはそれらについて考えません、あなたが慣れているように機能しないことは、まだ驚くべきことです)。
<C-o>
へのpopd
本格的な経験のために。
これは質問に対する直接的な答えではありませんが、4DOSのディレクトリ履歴ウィンドウが大好きになりました。Linux(およびCygwin)向けに独自のバージョンを作成しました。私はそれ簡単にインストールユーティリティを作ることに周り得たことがありませんが、あなたはbashのプロンプトの周りにあなたの方法を知っていれば、それはすべきではないこと実行している入手困難。あなたの質問に触発されて、Gitリポジトリに入れてGitHub:dirhistoryにアップロードしました。
基本的に、これはすべてのシェルからディレクトリの変更を収集するデーモンであり、履歴を表示して切り替え先のディレクトリを選択できるCdkプログラムです(スタックに限定されません)。本当に便利だと思い、4DOSと同じようにCtrl-PageUpにバインドしました。(私はPuTTYにパッチをあて、Ctrl-PageUpをBashに送信しました。)
私にとっては、pushd / popd / dirsはほとんど役に立ちますが、欠けています。そこで、本質的に20個のエイリアスのセットとして実装された「navd」と呼ばれるこれらの周りに「ラッパー」を作成しました。(そのうちの1つは実際には関数です。)コードは下にありますが、最初に簡単な説明を示します。(「navd」と他の人のマシンでの作業の良い点:「no-install」形式の実行:1つのインストールオプションとして、bashプロンプトで「navd」を実装するコマンドを貼り付けることができます。 、およびそのマシンnavdのbashセッションの期間中は機能します。これにより、ファイルシステムのフットプリントがゼロになりますが、それは一時的なインストールになります。コース。)
特徴:
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>コマンドはいずれもスタックを回転させ、現在のディレクトリになるディレクトリもスタックの先頭に表示されるようにします。正の<N>値は、インデックスをゼロから開始して、左から数えてdirを見つけます。負の<N>値は、-1から始まるインデックス付けで、右から数えてdirを見つけます。(これは、配列インデックスをJavaおよび他の言語で使用する方法の規則に従います。)
注:「navd」コマンドは、「pushd」および「dirs」が使用するものと同じスタックを表示しますが、「dirs」が表示する 左端のエントリなしで表示します(そのエントリは実際にはスタック上にないため、現在のディレクトリ と、cdコマンドが入力されると左端のエントリが変更される「dirs」を含む)。(「CDが<パス>」コマンドがnavdのいずれかの動作には影響しません、それは確かに行動に影響んが、のpushd / dirsに/ POPDのをも...私が使用するのが大好き。「CDを- 」「バック」を行くために一度にディレクトリから移動したばかりで、「cd-」はnavdの動作にも影響しません。)
ボーナス:スタックを回転させないが、スタックに示された場所にdirを変更するだけの19個のエイリアスがあります。
nav0 ... nav9 and nav-1 ... nav-9
2番目のボーナス:「navh」は履歴からnavd <path>コマンドを表示し、カットアンドペーストでスタックを簡単にロードします。(履歴に複数回存在する場合でも、各リストは1回だけリストされ、リストはソートされます。また、$ HOME / .navhignoreファイルにエントリを置くと、それらの正確なエントリがnavhリストに表示されなくなります。)
navh
3つの主要な動作:
スタックをクリアして、特定の「navd <path>」コマンドを繰り返すと、そのパスはスタックに移動します。それは私が望むものです...しかし、pushdはそれを行いません-それはあなたがナビゲートしている現在のディレクトリをスタックから置きます-したがって、コマンドを繰り返したときにスタックへの影響は可変です(予測できないと感じます) 。
「navd <path>」は同じパスをスタックに2回配置しません。
「navd <path>」は、コマンドに相対パスが入力された場合でも、絶対パスでコマンド履歴に記録されます。
私にとって、説明されている最後の3つの動作は、履歴から「navd <path>」コマンドを使用する方が、履歴から「pushd <path>」を使用するよりもはるかに役立ちます。私は本当に歴史を再利用して場所に行くことができます。そして、私がそうするとき、私は私のスタックを「損なう」ことはありません。
脳をラップできるのであれば、navdとpushd / dirs / popdの使用を切り替えることができます。両方とも同じスタックを使用します。別のスタイルで。たとえば、「popd」を使用して「navd」スタックから物を削除するか、「dirs -c」を使用してnavdスタックをクリアします。
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ファイルに入れて、より永続的にインストールすることもできます。
ここにあなたが好きかもしれないさらに別のソリューションがあります。@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を実行してから、別のコマンドを実行して必要なディレクトリをポップまたはcdするよりも、この方法が少し気に入っています。ダイアログメニューは、dialogrcを使用して高度にカスタマイズすることもできます。
あなたの質問に答えるために、はい、cdにプッシュされたエイリアシングは素晴らしいアイデアだと思います。少なくとも更新のためにマシンを定期的に再起動している場合、バッファオーバーフローの問題は発生しません。スクリプトを作成するときはcdを使用することに注意してください。whileループでcdを実行すると、バッファオーバーフローの問題が発生する可能性があります。何がdirs / pushdバッファサイズを制御するのかわかりません。
alias cd=pushd
ますか?