aliasing cd ke pushd - apakah itu ide yang bagus?

35

Apakah sebaiknya menggunakan alias berikut:

cd() {
    pushd $1;
}

di bash?

Saya pikir ini akan sangat berguna, karena saya kemudian dapat menggunakan serangkaian popds bukan hanya cd -sekali.

Apakah ada kasus di mana ini mungkin menjadi masalah?

Lazer
sumber
2
Saya tahu di zsh ada pengaturan untuk melakukan hal ini. Tidak yakin apa itu. Apakah perlu melakukan fungsi bukan hanya alias cd=pushd?
Falmarri
2
Saya akan kedua alias atas fungsi.
alesplin
1
Kenapa tidak alias nama baru saja. Bagaimana dengan pd? Apakah Anda satu-satunya pengguna dan administrator sistem Anda?
Kevin Cantu
3
@ Falmarri Pilihan zsh adalahautopushd
Michael Mrozek
1
Sebenarnya, itu adalah fungsi, bukan alias (tapi semua lebih baik).
tripleee

Jawaban:

39

Secara pribadi, saya memiliki ini di bashrc saya dan menggunakannya sepanjang waktu:

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'

Anda kemudian dapat bernavigasi di sekitar baris perintah seperti browser. cdmengubah direktori. backpergi ke direktori sebelumnya yang Anda cdgunakan. Dan flipakan berpindah di antara direktori saat ini dan sebelumnya tanpa muncul dari tumpukan direktori. Secara keseluruhan, ini bekerja dengan baik.

Satu-satunya masalah nyata yang saya sadari adalah kenyataan bahwa itu adalah seperangkat perintah yang saya sudah terbiasa tetapi tidak ada pada mesin orang lain. Jadi, jika saya harus menggunakan mesin orang lain, itu bisa sedikit frustasi. Jika Anda terbiasa hanya menggunakan pushddan popdlangsung, Anda tidak memiliki masalah itu. Dan sementara jika Anda hanya cdmemasukkan alias tidak popd, Anda tidak akan memiliki masalah backtidak ada, Anda masih akan memiliki masalah yang cdtidak melakukan apa yang Anda harapkan pada komputer lain.

Saya akan mencatat, bagaimanapun, bahwa implementasi khusus Anda cdtidak cukup berfungsi seperti cdpada normal cddengan sendirinya akan pergi ke direktori home Anda, tetapi Anda tidak. Versi yang saya miliki di sini tidak memiliki masalah itu. Milik saya juga ditambahkan DIRSTACKke bagian depan dirscetakan, tetapi itu lebih merupakan masalah selera pribadi daripada apa pun.

Jadi, seperti yang saya katakan, saya menggunakan alias ini sepanjang waktu dan tidak punya masalah dengan mereka. Hanya saja bisa sedikit frustasi jika harus menggunakan mesin lain dan kemudian menemukan mereka tidak ada di sana (yang seharusnya tidak mengejutkan, tetapi mereka adalah salah satu hal yang sering Anda gunakan sehingga Anda tidak memikirkannya) , jadi memiliki mereka tidak bekerja seperti dulu masih bisa mengejutkan).

Jonathan M Davis
sumber
Saran yang sangat baik! Pengguna Vi / Vimperator dapat mengonfigurasi <C-o>untuk popduntuk pengalaman otentik.
unperson325680
1
@progo dapatkah Anda menjelaskan bagaimana flip akan mengubah direktori dengan muncul dari tumpukan direktori?
Jonathan.
Setelah terbiasa dengan konfigurasi zsh, ini tidak ada: (1) deduplikasi item di dirstack, dan (2) cara untuk langsung cd ke item di dirstack dengan indeksnya. Saya pikir saya dapat dengan mudah menulis pembungkus untuk mengimplementasikan ini ... Sayangnya tampaknya DIRSTACK bash tidak diizinkan untuk dimodifikasi, sehingga dupes mungkin harus tinggal.
Steven Lu
Bisakah Anda menambahkan jelas untuk menghapus dir?
Pasupathi Rajamanickam
7

Ini bukan jawaban langsung untuk pertanyaan itu, tetapi saya jatuh cinta dengan jendela histori direktori di 4DOS. Sedemikian rupa sehingga saya menulis versi saya sendiri untuk Linux (dan Cygwin). Aku tidak pernah sempat untuk membuat sebuah utilitas yang mudah-ke-install, tetapi jika Anda tahu jalan di prompt Bash, seharusnya tidak bahwa sulit untuk mendapatkan berjalan. Pertanyaan Anda menginspirasi saya untuk memasukkannya ke repo Git dan mengunggahnya ke GitHub: dirhistory .

Pada dasarnya, ini adalah daemon yang mengumpulkan perubahan direktori dari semua shell Anda, dan program Cdk yang menampilkan histori dan memungkinkan Anda memilih direktori mana saja untuk beralih (sehingga Anda tidak terbatas pada tumpukan). Saya merasa ini sangat berguna, dan saya harus mengaitkannya dengan Ctrl-PageUp, seperti yang dilakukan 4DOS. (Saya bahkan menambal Putty sehingga akan mengirim Ctrl-PageUp ke Bash.)

cjm
sumber
0

Bagi saya pushd / popd / dirs hampir membantu, tetapi kurang. Jadi saya membuat 'pembungkus' di sekitar ini yang disebut 'navd', diimplementasikan pada dasarnya satu set 20 alias. (Salah satunya adalah fungsi, sungguh.) Kode di bawah ini, tetapi di sini adalah penjelasan singkat terlebih dahulu. (Satu hal yang menyenangkan tentang "navd" dan bekerja di mesin orang lain: Ada bentuk "no-install" untuk menjalankannya: Sebagai satu opsi instal, Anda cukup menempel-di perintah yang mengimplementasikan "navd" di bash-prompt) , dan selama sesi bash untuk mesin itu navd akan bekerja. Itu memberikan nol kaki-cetak dalam sistem file, namun itu adalah instalasi sementara. Masukkan perintah-perintah itu dalam .bashrc untuk instalasi "nyata", dari tentu saja.)

Fitur:

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**

Setiap perintah <N> sembilan belas navd memutar tumpukan sehingga direktori yang menjadi direktori saat ini juga sekarang ditampilkan di bagian depan tumpukan. Nilai <N> positif menemukan dir menghitung dari kiri, dengan pengindeksan dimulai dari nol. Nilai <N> negatif menemukan penghitungan dir dari KANAN, dengan pengindeksan dimulai pada -1. (Ini mengikuti konvensi tentang bagaimana indeks array dapat digunakan dalam Java dan bahasa lainnya.)

Catatan: Setiap perintah "navd" menampilkan tumpukan yang sama yang digunakan "pushd" dan "dirs" - tetapi menampilkannya TANPA entri paling kiri yang akan ditampilkan "dirs" (karena entri itu tidak benar-benar di stack - itu direktori saat ini dan dengan "dirs" yang paling kiri akan berubah jika perintah cd dimasukkan). (The "cd <path>" perintah tidak mempengaruhi perilaku navd meskipun tentu saja mempengaruhi perilaku dari pushd / dirs / popd Juga ... Saya suka menggunakan. "Cd -" untuk "kembali" sekali ke direktori yang baru saja saya navigasikan, dan "cd -" tidak mempengaruhi perilaku nAVD juga.)

Bonus: Ada 19 alias lebih yang TIDAK memutar stack, tetapi hanya mengubah dir ke tempat yang ditunjukkan pada stack.

 nav0 ... nav9   and   nav-1  ... nav-9

Bonus 2: "navh" menunjukkan perintah npath <path> dari histori, untuk dengan mudah memuat stack dengan cut-n-paste. (Masing-masing terdaftar hanya sekali walaupun itu ada dalam sejarah beberapa kali, dan daftarnya diurutkan. Selain itu, entri dapat dimasukkan ke dalam file $ HOME / .navhignore untuk mencegah entri yang tepat itu muncul di daftar navh.)

 navh

Tiga perilaku utama:

  1. Jika Anda mengosongkan tumpukan dan mengulangi perintah "navd <path>" tertentu, jalur itu akan berada di tumpukan. Itulah yang saya inginkan dan harapkan ... tetapi pushd tidak melakukan itu - itu membuat direktori saat ini Anda menavigasi JAUH dari stack - sehingga efek pada stack adalah variabel (terasa tidak dapat diprediksi) ketika Anda mengulangi perintah .

  2. "navd <path>" tidak akan menempatkan jalur yang sama pada tumpukan dua kali.

  3. "navd <path>" menempatkan dirinya dalam sejarah perintah dengan path absolut bahkan jika path relatif diketik untuk perintah.

Bagi saya, tiga perilaku terakhir yang dijelaskan membuat menggunakan perintah "navd <path>" dari sejarah jauh lebih bermanfaat daripada menggunakan "pushd <path>" dari sejarah. Saya benar - benar dapat menggunakan kembali sejarah untuk pergi ke suatu tempat. Dan ketika saya melakukannya saya tidak "merusak" tumpukan saya.

Jika Anda bisa dan ingin membungkus otak Anda dengannya, Anda dapat beralih antara menggunakan navd dan pushd / dirs / popd. Keduanya menggunakan tumpukan yang sama; hanya dengan gaya yang berbeda. Misalnya, gunakan "popd" untuk menghapus hal-hal dari tumpukan "navd", atau gunakan "dirs -c" untuk menghapus tumpukan navd.

Pikirkan pushd / dirs / popd sebagai "bagaimana cara menelusuri kembali langkah saya?".
Pikirkan navd sebagai "bagaimana cara mempertahankan satu set direktori favorit, dan dengan mudah beralih di antara mereka?".

Rekatkan yang berikut ke jendela terminal, dan Anda dapat segera mulai menggunakan navd selama sesi-terminal itu. Ini semua kode yang ada untuk fitur ini.

# 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.)"'

Alias ​​ini didasarkan pada perintah "bash". Perhatian khusus diberikan untuk menjaga perilaku normal "cd -". (Banyak kali saya menggunakan "cd -" bukannya repot dengan pushd atau navd - karena "cd -" sangat berguna untuk kembali ke "tempat" terakhir Anda, atau beralih di antara hanya 2 tempat, dan ini bekerja di mana saja tanpa instalasi.)

Perintah-perintah ini, tentu saja, dapat dimasukkan ke dalam file .bashrc untuk instalasi yang lebih permanen.

Dana Forsberg
sumber
1
Dana, Anda tampaknya memiliki dua akun terpisah dengan nama yang sama. Anda dapat menggabungkannya dengan cukup mudah.
roaima
Anda memutar penerjemah perl setiap kali Anda mengubah direktori? Tidak, terima kasih.
Tripp Kinetics
0

Inilah solusi lain yang mungkin Anda sukai. Saya menulis ini setelah bermain dengan solusi oleh @cjm. Ini menggunakan perintah dialog untuk membuat menu jenis ncurses dari output dirs. Memilih item akan membawa direktori itu ke atas tumpukan dan cd ke dalamnya. Ini memiliki keunggulan dibandingkan dirhistory dengan memberikan setiap emulator terminal buffer sejarah direktori sendiri, dan menjadi sedikit lebih mudah untuk menginstal.

Untuk menginstal: Setelah Anda menambahkan cd ke pushd, instal dialog, lalu masukkan fungsi ini di bashrc Anda:

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
}

Saya suka ini sedikit lebih baik daripada menjalankan dirs -v, kemudian menjalankan perintah lain untuk pop atau cd ke direktori yang saya inginkan. Menu dialog juga dapat sangat disesuaikan melalui dialogrc-nya.

Jadi untuk menjawab pertanyaan Anda, ya, saya pikir aliasing pushd to cd adalah ide bagus. Anda tidak mungkin memiliki masalah buffer overflow jika Anda me-reboot mesin Anda secara rutin setidaknya untuk pembaruan. Meskipun saya akan berhati-hati menggunakan cd saat scripting; cd dalam loop sementara berpotensi menyebabkan masalah buffer overflow. Saya tidak yakin apa yang mengontrol ukuran buffer dirs / pushd.

Overdr0ne
sumber