Aliasing von CD auf Pushd - ist das eine gute Idee?

35

Ist es eine gute Idee, den folgenden Alias ​​zu verwenden:

cd() {
    pushd $1;
}

in der Bash?

Ich denke, das wäre sehr nützlich, da ich dann eine Reihe von popds anstelle von nur einem verwenden kann cd -.

Gibt es einen Fall, in dem dies ein Problem sein könnte?

Laser
quelle
2
Ich weiß, in zsh gibt es eine Einstellung, um genau dies zu tun. Ich bin mir nicht sicher, was es ist. Ist es notwendig, eine Funktion statt nur zu tun alias cd=pushd?
Falmarri
2
Ich würde den Alias ​​über die Funktion unterstützen.
Alesplin
1
Warum nicht stattdessen einen neuen Namen vergeben? Wie wäre es pd? Sind Sie der einzige Benutzer und Administrator Ihres Systems?
Kevin Cantu
3
@ Falmarri Die zsh-Option istautopushd
Michael Mrozek
1
Genau genommen ist das eine Funktion, kein Alias ​​(aber umso besser).
Tripleee

Antworten:

39

Persönlich habe ich diese in meinem bashrc und benutze sie die ganze Zeit:

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'

Sie können dann in der Befehlszeile ein wenig wie in einem Browser navigieren. cdwechselt das Verzeichnis. backWechselt zum vorherigen Verzeichnis, aus dem Sie herausgearbeitet haben cd. Und flipwechselt zwischen dem aktuellen und dem vorherigen Verzeichnis, ohne sie vom Verzeichnisstapel zu entfernen. Insgesamt funktioniert es super.

Das einzige wirkliche Problem, das mir bewusst ist, ist die Tatsache, dass es sich dann um eine Reihe von Befehlen handelt, die ich völlig gewohnt bin, aber auf keinem anderen Computer existieren. Wenn ich also die Maschine einer anderen Person benutzen muss, kann das ein bisschen frustrierend sein. Wenn Sie es gewohnt sind, nur zu verwendenpushd und popddirekt zu verwenden, haben Sie dieses Problem nicht. Und wenn Sie nur den Alias ​​" cdnicht" verwenden popd, wird das Problem " backnicht vorhanden" nicht auftreten. Es tritt jedoch immer noch das Problem auf, cddas auf anderen Computern nicht so gut funktioniert, wie Sie es erwarten.

Ich würde jedoch bemerken, dass Ihre besondere Umsetzung von cd nicht ganz so funktioniert, wie cddie normale cdvon sich aus in Ihr Home-Verzeichnis wechselt, aber Ihre nicht. Die Version, die ich hier habe, hat dieses Problem nicht. Meins hängt auch DIRSTACKauf der Vorderseite des dirsAusdrucks, aber das ist mehr eine Frage des persönlichen Geschmacks als alles andere.

Wie gesagt, ich benutze diese Aliase die ganze Zeit und habe kein Problem damit. Es kann nur ein bisschen frustrierend sein, eine andere Maschine zu verwenden und sie dann nicht dort zu finden (was nicht verwunderlich sein sollte, aber sie gehören zu den Dingen, die Sie so oft verwenden, dass Sie nicht an sie denken Es kann also immer noch überraschend sein, wenn sie nicht so funktionieren, wie Sie es gewohnt sind.

Jonathan M Davis
quelle
Exzellente Beratung! Vi / Vimperator-Benutzer können das <C-o>to popdfür authentische Erlebnisse konfigurieren .
unperson325680
1
@progo kannst du erklären, wie Flip das Verzeichnis ändert, indem er vom Verzeichnisstapel abspringt?
Jonathan.
Nachdem Sie sich an zsh configs gewöhnt haben, fehlt dies: (1) Deduplizierung von Elementen im Verzeichnis, und (2) Möglichkeiten, um ein Element im Verzeichnis mit seinem Index direkt zu cd. Ich denke, ich kann leicht Wrapper schreiben, um diese zu implementieren ... Leider scheint es, dass Bashs DIRSTACK nicht modifiziert werden darf, so dass Dupes einfach bleiben müssen.
Steven Lu
Kannst du bitte clear to clear dirs hinzufügen?
Pasupathi Rajamanickam
7

Dies ist keine direkte Antwort auf die Frage, aber ich habe mich in das Verzeichnisverlaufsfenster in 4DOS verliebt. So sehr, dass ich meine eigene Version für Linux (und Cygwin) geschrieben habe. Ich habe noch nie auf so dass es eine leicht zu installierende Dienstprogramm dazu gekommen, aber wenn Sie kennen sich in einer Bash - Eingabeaufforderung, es sollte nicht sein , dass schwer zum Laufen zu bekommen. Ihre Frage hat mich dazu inspiriert, sie in ein Git-Repo zu stellen und auf GitHub: dirhistory hochzuladen .

Grundsätzlich ist es ein Daemon, der Verzeichnisänderungen von all Ihren Shells sammelt, und ein Cdk-Programm, das den Verlauf anzeigt und es Ihnen ermöglicht, jedes Verzeichnis auszuwählen, zu dem Sie wechseln möchten (Sie sind also nicht auf einen Stapel beschränkt). Ich finde es sehr nützlich und habe es an Ctrl-PageUp gebunden, genau wie 4DOS. (Ich habe sogar PuTTY gepatcht, damit es Ctrl-PageUp an Bash sendet.)

cjm
quelle
0

Für mich ist pushd / popd / dirs fast hilfreich, aber es fehlt. Also habe ich einen "Wrapper" erstellt, der "navd" heißt und im Wesentlichen aus 20 Aliasen besteht. (Eine davon ist wirklich eine Funktion.) Der Code ist unten, aber hier ist zuerst eine kurze Erklärung. (Eine nette Sache über "navd" und das Arbeiten auf den Rechnern anderer Leute: Es gibt eine "no-install" -Form, um es auszuführen: Als eine Installationsoption können Sie einfach die Befehle einfügen, die "navd" an der Bash-Eingabeaufforderung implementieren , und für die Dauer dieser Bash-Sitzung auf dieser Maschine funktioniert navd. Das ergibt keinen Footprint im Dateisystem, stellt jedoch eine temporäre Installation dar. Geben Sie diese Befehle für eine "echte" Installation in .bashrc ein, von Kurs.)

Eigenschaften:

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

Jeder der neunzehn navd <N> -Befehle dreht den Stapel so, dass das Verzeichnis, das zum aktuellen Verzeichnis wird, jetzt auch vorne im Stapel angezeigt wird. Positive <N> -Werte finden eine Richtungszählung von links, wobei die Indizierung bei Null beginnt. Negative <N> -Werte geben ein Verzeichnis an, das von RECHTS aus gezählt wird, wobei die Indizierung bei -1 beginnt. (Dies folgt der Konvention, wie Array-Indizes in Java und anderen Sprachen verwendet werden können.)

Hinweis: Jeder "navd" -Befehl zeigt denselben Stapel an, den "pushd" und "dirs" verwenden - zeigt ihn jedoch OHNE den Eintrag ganz links an , den "dirs" anzeigen würde (da sich dieser Eintrag nicht wirklich im Stapel befindet - es ist Das aktuelle Verzeichnis und mit "dirs" der am weitesten links stehende Eintrag ändern sich, wenn ein CD-Befehl eingegeben wird. (Der Befehl "cd <Pfad>" hat keine Auswirkung auf das Verhalten von navd, obwohl er sich durchaus auf das Verhalten von pushd / dirs / popd auswirkt. Außerdem ... verwende ich "cd -", um einmal zu a "zurückzukehren" Verzeichnis, von dem ich gerade weg navigiert bin, und "cd -" hat auch keinen Einfluss auf das Verhalten von navd.)

Bonus: Es können 19 weitere Aliase vorhanden sein, die den Stapel NICHT drehen, sondern lediglich in die auf dem Stapel angegebene Position wechseln.

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

2. Bonus: "navh" zeigt navd <path> -Befehle aus dem Verlauf an, um den Stapel einfach mit Ausschneiden und Einfügen zu laden. (Jedes Element wird nur einmal aufgeführt, auch wenn es mehrere Male im Verlauf ist, und die Liste wird sortiert. Außerdem können Einträge in eine $ HOME / .navhignore-Datei eingefügt werden, um zu verhindern, dass genau diese Einträge in der Navigationsliste angezeigt werden.)

 navh

Drei wichtige Verhaltensweisen:

  1. Wenn Sie den Stapel löschen und einen bestimmten Befehl "navd <Pfad>" wiederholen, wird dieser Pfad auf dem Stapel gespeichert. Das ist, was ich will und erwarte ... aber pushd macht das nicht - es legt die aktuelle Richtung, in der Sie von dem Stapel weg navigieren, auf den Stapel, so dass der Effekt auf den Stapel variabel ist (sich unvorhersehbar anfühlt), wenn Sie den Befehl wiederholen .

  2. "navd <Pfad>" legt nicht zweimal denselben Pfad auf dem Stapel ab.

  3. "navd <Pfad>" stellt sich selbst dann mit dem absoluten Pfad in den Befehlsverlauf, wenn der relative Pfad für den Befehl eingegeben wurde.

Aufgrund der drei zuletzt beschriebenen Verhaltensweisen ist die Verwendung eines Befehls "navd <Pfad>" aus dem Verlauf viel hilfreicher als die Verwendung eines Befehls "pushd <Pfad>" aus dem Verlauf. Ich kann Geschichte wirklich wiederverwenden, um Orte zu besuchen. Und wenn ich das tue, "verderbe" ich meinen Stapel nicht.

Wenn Sie Ihr Gehirn darum wickeln können und möchten, können Sie zwischen navd und pushd / dirs / popd wechseln. Beide verwenden denselben Stapel. nur mit einem anderen Stil. Verwenden Sie beispielsweise "popd", um Objekte aus dem "navd" -Stapel zu entfernen, oder verwenden Sie "dirs -c", um den navd-Stapel zu löschen.

Stellen Sie sich pushd / dirs / popd als "Wie kann ich meine Schritte zurückverfolgen?" Vor.
Stellen Sie sich navd als "Wie halte ich mich an eine Reihe von Lieblingsverzeichnissen und schalte einfach zwischen diesen um" vor.

Fügen Sie Folgendes in ein Terminalfenster ein, und Sie können navd sofort für die Dauer dieser Terminalsitzung verwenden. Dies ist der gesamte Code für diese Funktion.

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

Diese Aliase basieren auf "bash" -Befehlen. Es wird besondere Sorgfalt darauf verwendet, das normale Verhalten von "cd -" beizubehalten. (Ich benutze oft "cd -" anstatt mich mit "pushd" oder "navd" zu beschäftigen - weil "cd -" sehr praktisch ist, um zum letzten "Ort" zurückzukehren oder zwischen nur 2 Orten zu wechseln, und Es funktioniert überall ohne Installation.)

Diese Befehle können natürlich für eine dauerhaftere Installation in die .bashrc-Datei eingefügt werden.

Dana Forsberg
quelle
1
Dana, du scheinst zwei getrennte Konten mit demselben Namen zu haben. Sie können sie ziemlich einfach zusammenführen.
Roaima
Sie drehen jedes Mal, wenn Sie das Verzeichnis wechseln, einen Perl-Interpreter hoch? Nein Danke.
Tripp Kinetics
0

Hier ist noch eine andere Lösung, die Ihnen gefallen könnte. Ich schrieb dies, nachdem ich mit der Lösung von @cjm gespielt hatte. Mit dem Befehl dialog wird aus der Ausgabe von dirs ein Menü vom Typ ncurses erstellt. Wenn Sie ein Element auswählen, wird dieses Verzeichnis an den Anfang des Stapels verschoben und auf CD gespeichert. Dies hat gegenüber dem Verzeichnisverlauf den Vorteil, dass jedem Terminalemulator ein eigener Verzeichnisverlaufspuffer zugewiesen und die Installation ein wenig vereinfacht wird.

So installieren Sie: Sobald Sie die Ausrichtung von cd auf pushd festgelegt haben, installieren Sie das Dialogfeld und fügen Sie diese Funktion in Ihren bashrc ein:

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
}

Das gefällt mir ein bisschen besser, als dirs -v auszuführen und dann einen anderen Befehl auszuführen, um das gewünschte Verzeichnis zu öffnen oder eine CD zu erstellen. Dialogmenüs können auch durch ihre Dialogrc in hohem Maße angepasst werden.

Um Ihre Frage zu beantworten: Ja, ich denke, Aliasing von Pushd auf CD ist eine großartige Idee. Es ist unwahrscheinlich, dass Probleme mit dem Pufferüberlauf auftreten, wenn Sie Ihren Computer regelmäßig neu starten, zumindest, um Updates zu erhalten. Allerdings würde ich beim Schreiben von Skripten vorsichtig mit CDs umgehen. cd in einer while-Schleife kann möglicherweise Probleme mit dem Pufferüberlauf verursachen. Ich bin nicht sicher, was die dirs / pushd Puffergröße steuert.

Overdr0ne
quelle