aliasing cd na pushd - czy to dobry pomysł?

35

Czy dobrym pomysłem jest użycie następującego aliasu:

cd() {
    pushd $1;
}

w bash?

Myślę, że byłoby to bardzo przydatne, ponieważ mogę wtedy użyć serii popds zamiast tylkocd - raz.

Czy jest jakiś przypadek, w którym może to stanowić problem?

Lazer
źródło
2
Wiem, że w Zsh jest na to ustawienie. Nie jestem jednak pewien, co to jest. Czy konieczne jest wykonanie funkcji zamiast po prostu alias cd=pushd?
Falmarri
2
Popierałbym alias nad funkcją.
alesplin,
1
Zamiast tego zamiast tego możesz użyć aliasu nowej nazwy. Jak o pd? Czy jesteś jedynym użytkownikiem i administratorem swojego systemu?
Kevin Cantu
3
@Falmarri Opcja zsh toautopushd
Michael Mrozek
1
Ściśle mówiąc, jest to funkcja, a nie alias (ale tym lepiej).
tripleee

Odpowiedzi:

39

Osobiście mam je w moim bashrc i używam ich przez cały czas:

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'

Następnie możesz poruszać się po linii poleceń trochę jak przeglądarkę. cdzmienia katalog. backprzechodzi do poprzedniego katalogu, z którego cdedytowałeś. I flipbędzie przechodzić między bieżącym i poprzednim katalogiem bez wyskakiwania go ze stosu katalogów. Ogólnie rzecz biorąc, działa świetnie.

Jedyny prawdziwy problem, o którym jestem świadomy, to fakt, że jest to zestaw poleceń, do których jestem całkowicie przyzwyczajony, ale których nie ma na maszynie innej osoby. Więc jeśli muszę korzystać z czyjejś maszyny, może to być trochę frustrujące. Jeśli jesteś przyzwyczajony do zwykłego używania pushdi popdbezpośrednio, nie masz tego problemu. I chociaż po prostu cdnie umieścisz aliasu popd, nie będziesz miał problemu z backnieistnieniem, ale nadal będziesz mieć problem, cdktóry nie robi dokładnie tego, czego oczekujesz na innych komputerach.

Chciałbym jednak zauważyć, że twoja konkretna implementacja cdnie działa tak, cdże normalna cdsama w sobie przejdzie do twojego katalogu domowego, ale twoja nie. Wersja, którą tu mam, nie ma tego problemu. Mój również dołącza DIRSTACKsię z przodu dirswydruku, ale to bardziej kwestia osobistego gustu niż cokolwiek innego.

Tak więc, jak powiedziałem, używam tych aliasów cały czas i nie mam z nimi problemu. Tyle, że korzystanie z innej maszyny i znajdowanie ich tam może być nieco frustrujące (co nie powinno być zaskakujące, ale są jedną z tych rzeczy, których używasz tak często, że o nich nie myślisz) , więc ich niedziałanie, tak jak zwykle, może być zaskakujące).

Jonathan M. Davis
źródło
Doskonała rada! Użytkowników vi / Vimperator można skonfigurować <C-o>do popdautentycznego doświadczenia.
unperson325680
1
@progo, czy możesz wyjaśnić, jak flip zmieni katalog z wyskakiwaniem ze stosu katalogów?
Jonathan.
Po przyzwyczajeniu się do konfiguracji zsh brakuje tego: (1) deduplikacja elementów na dirstack i (2) sposoby po prostu cd bezpośrednio do elementu w dirstack z jego indeksem. Myślę, że mogę łatwo napisać opakowania, aby je zaimplementować ... Niestety wydaje się, że DIRSTACK bash nie może być modyfikowany, więc duplikaty mogą po prostu zostać.
Steven Lu
Czy możesz dodać jasne, aby wyczyścić katalog?
Pasupathi Rajamanickam
7

To nie jest bezpośrednia odpowiedź na pytanie, ale zakochałem się w oknie historii katalogów w 4DOS. Tak bardzo, że napisałem własną wersję dla systemu Linux (i Cygwin). Nigdy nie udało mi się uczynić z tego łatwego w instalacji narzędzia, ale jeśli znasz się na pytaniu Bash, uruchomienie nie powinno być takie trudne. Twoje pytanie zainspirowało mnie do umieszczenia go w repozytorium Git i przesłania go do GitHub: dirhistory .

Zasadniczo jest to demon, który zbiera zmiany katalogów ze wszystkich twoich powłok, oraz program Cdk, który wyświetla historię i pozwala wybrać dowolny katalog do przełączenia (więc nie jesteś ograniczony do stosu). Uważam, że jest to bardzo przydatne i wiąże je z Ctrl-PageUp, podobnie jak 4DOS. (Nawet załatałem PuTTY, żeby wysyłało Ctrl-PageUp do Basha.)

cjm
źródło
0

Dla mnie pushd / popd / dirs jest bardzo pomocny, ale go brakuje. Stworzyłem więc „wrapper” wokół tych nazwanych „navd”, zaimplementowany jako zasadniczo zestaw 20 aliasów. (Jedna z nich jest naprawdę funkcją). Kod znajduje się poniżej, ale najpierw jest krótkie wyjaśnienie. (Jedną fajną rzeczą w „navd” i pracy na komputerach innych ludzi: jest forma uruchamiania bez instalacji: jako jedną z opcji instalacji możesz po prostu wkleić polecenia, które implementują „navd” po znaku zachęty bash , i na czas trwania tej sesji bash dla tego urządzenia nawigacja będzie działać. Daje to zerowy ślad w systemie plików, ale jest to instalacja tymczasowa. Umieść te polecenia w .bashrc, aby uzyskać „prawdziwą” instalację kierunek.)

Cechy:

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

Każde z dziewiętnastu poleceń navd <N> powoduje obrócenie stosu, tak że katalog, który staje się bieżącym katalogiem, jest teraz wyświetlany również na początku stosu. Dodatnie wartości <N> znajdują liczenie katalogów od lewej, a indeksowanie rozpoczyna się od zera. Ujemne wartości <N> znajdują katalog liczący od PRAWEJ, z indeksowaniem rozpoczynającym się od -1. (Jest to zgodne z konwencją dotyczącą sposobu używania indeksów tablicowych w Javie i innych językach).

Uwaga: Każde polecenie „navd” wyświetla ten sam stos, którego używają „pushd” i „dirs” - ale wyświetla je BEZ lewego skrajnego wpisu, który wyświetlałby „dirs” (ponieważ ten wpis tak naprawdę nie znajduje się na stosie - jest bieżący katalog i „ katalogi ”, które najbardziej w lewo zmieniają się po wprowadzeniu polecenia cd). (Polecenie „cd <ścieżka>” nie wpływa na żadne zachowanie navd, choć z pewnością wpływa na zachowanie pushd / dirs / popd. Ponadto ... Uwielbiam używać „cd -”, aby raz wrócić do „ a” katalog, z którego właśnie nawigowałem, a „cd -” również nie wpływa na zachowanie navd.)

Premia: Może być jeszcze 19 aliasów, które NIE obracają stosu, a jedynie zmieniają katalog na miejsce wskazane na stosie.

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

Drugi bonus: „navh” pokazuje polecenia navd <path> z historii, aby łatwo załadować stos za pomocą cut-n-paste. (Każda z nich jest wymieniona tylko raz, nawet jeśli jest wielokrotnie w historii, a lista jest posortowana. Ponadto wpisy można umieścić w pliku $ HOME / .navhignore, aby zapobiec pojawianiu się tych dokładnych wpisów na liście nawigacji).

 navh

Trzy kluczowe zachowania:

  1. Jeśli wyczyścisz stos i powtórzysz określone polecenie „navd <ścieżka>”, ścieżka ta trafi na stos. Tego właśnie oczekuję i oczekuję ... ale pushd tego nie robi - ustawia bieżący katalog, którym nawigujesz DALEKO od stosu - więc efekt na stosie jest zmienny (wydaje się nieprzewidywalny) po powtórzeniu polecenia .

  2. „navd <ścieżka>” nie umieści dwukrotnie tej samej ścieżki na stosie.

  3. „navd <ścieżka>” zapisuje się w historii poleceń z bezwzględną ścieżką, nawet jeśli dla polecenia została wpisana ścieżka względna .

Dla mnie trzy ostatnie opisane zachowania sprawiają, że użycie polecenia „navd <ścieżka>” z historii jest o wiele bardziej pomocne niż użycie polecenia „pushd <ścieżka>” z historii. Naprawdę mogę ponownie wykorzystać historię, aby przejść do miejsc. A kiedy to robię, nie psuję swojego stosu.

Jeśli możesz i chcesz otoczyć go mózgiem, możesz przełączać się między używaniem navd i pushd / dirs / popd. Oba używają tego samego stosu; tylko w innym stylu. Na przykład użyj „popd”, aby usunąć rzeczy ze stosu „navd”, lub użyj „dirs -c”, aby wyczyścić stos navd.

Pomyśl o pushd / dirs / popd jako „jak mogę odtworzyć moje kroki?”.
Pomyśl o navd jako „jak trzymać się zestawu ulubionych katalogów i łatwo przełączać się między nimi?”.

Wklej poniższe w oknie terminala, a możesz natychmiast rozpocząć korzystanie z navd na czas trwania sesji terminalu. To jest cały kod do tej funkcji.

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

Te aliasy są oparte na poleceniach „bash”. Szczególną uwagę zwraca się na zachowanie normalnego zachowania „cd -”. (Dużo czasu używam „cd -” zamiast zawracać sobie głowę pushd lub navd - ponieważ „cd -” jest bardzo przydatny do powrotu do ostatniego „miejsca”, w którym byłeś, lub przełączania się tylko z 2 miejsc, i działa wszędzie bez instalacji).

Te polecenia można oczywiście umieścić w pliku .bashrc w celu ich bardziej trwałej instalacji.

Dana Forsberg
źródło
1
Dana, wydaje się, że masz dwa oddzielne konta o tej samej nazwie. Możesz połączyć je dość łatwo.
roaima
Rozdajesz interpretera perla za każdym razem, gdy zmieniasz katalog? Nie, dziękuję.
Tripp Kinetics
0

Oto kolejne rozwiązanie, które może ci się spodobać. Napisałem to po pobraniu rozwiązania @cjm. Używa polecenia dialogowego, aby utworzyć menu typu ncurses z danych wyjściowych katalogów. Wybranie elementu spowoduje przeniesienie tego katalogu na szczyt stosu i umieszczenie w nim dysku CD. Ma to tę przewagę nad dirhistory, że daje każdemu emulatorowi terminala własny bufor historii katalogów i jest nieco łatwiejsze do zainstalowania.

Aby zainstalować: Po aliacji cd na pushd, zainstaluj okno dialogowe, a następnie po prostu włóż tę funkcję do 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
}

Podoba mi się to trochę lepiej niż uruchomienie katalogów -v, a następnie uruchomienie innego polecenia, aby pop lub cd do katalogu, który chcę. Menu dialogu można również bardzo dostosować poprzez jego dialogrc.

Więc, aby odpowiedzieć na twoje pytanie, tak, myślę, że aliasing pushd na cd to świetny pomysł. Jest mało prawdopodobne, że będziesz mieć problemy z przepełnieniem bufora, jeśli regularnie restartujesz komputer przynajmniej w celu aktualizacji. Chociaż będę ostrożny przy korzystaniu z cd podczas pisania skryptów; cd w pętli while może potencjalnie powodować problemy z przepełnieniem bufora. Nie jestem pewien, co kontroluje rozmiar bufora katalogów / pushd.

Overdr0ne
źródło