Kann ein Alias ​​von ',,' auf '..' gesetzt werden?

41

Manchmal, wenn ich in das übergeordnete Verzeichnis wechseln möchte, tippe ich versehentlich cd ,,statt cd ... Gibt es eine Möglichkeit, wie ich bash sagen kann, dass diese Aussagen gleich sind? Ich benutze in meinen Befehlen niemals Kommas. Im Idealfall würde ich gerne alias ,,dazu ... Als ich das versuchte, funktionierte es nicht. Warum hat das nicht funktioniert? Wie kann ich dieses Problem sonst lösen?

$ alias ,,=..
$ cd ,,
-bash: cd: ,,: No such file or directory
Kilojoule
quelle
6
Ein Alias ​​ist ein auszuführendes Programm und kein Argument für das Programm. so $ ,,würden sich beschweren, wie zum Beispiel: bash: ..: Is a directory. (Mit anderen Worten, es ist keine ausführbare Datei.)
Jpaugh
5
@jpaugh: Eine klarere Art zu sagen ist: Alias-Erweiterung findet nur beim ersten "Wort" eines Befehls statt. Wie Sie sagen, funktioniert dies nur für Befehlsnamen, nicht für Argumente. (Und Sie konnten nicht einmal alias 'cd ,,'='cd ..'. Nun, Sie konnten, aber Sie müssten es laufen lassen cd\ ,,, um alles ein Wort zu machen.)
Peter Cordes
5
Betrachte zsh. Es hat globale Aliase alias -g ,,=..und cd ,,funktioniert so, wie Sie es erwarten.
muru
1
Querdenken: find / -type d -exec ln -s .. {}/,, \;... ;-)
Toby Speight
2
Imho: Tu das nicht. Es ist eine schlechte Praxis, Aliase zu verwenden, um typografische Fehler zu vertuschen. Diese Fehler können in kopiertem Code oder Screencasts auftreten. Auf anderen Hosts oder Konten funktioniert es nicht. Und eine solche Änderung (abhängig davon, wie sie implementiert ist) kann andere, unerwartete und schwer zu debuggende Fehler verursachen. Mein Vorschlag: Wenn Sie einen Befehl falsch eingeben, geben Sie ihn einfach noch einmal ein ;-).
jjmontes

Antworten:

45

ZSH:

Wenn Sie verwenden, zsh alias -g ,,=".."ist es das, was Sie benötigen, aber dies wird dazu führen, dass ",," überall erweitert wird, nicht nur, wenn es mit verwendet wird cd.

Von man zshbuiltins:

Wenn das -g Flag vorhanden ist, definieren Sie einen globalen Alias. globale Aliase werden erweitert, auch wenn sie nicht in der Befehlsposition auftreten.

BASH:

Wenn Sie die Einschränkung auf bash(da die Frage mit ) haben, lesen Sie Folgendes:

Dies ist, wie gewünscht, eine reine Alias-Lösung, die jedoch mehr als erforderlich ist und möglicherweise den Benutzer frustriert (siehe die Warnung am Ende meines Beitrags).

Zitat man bash:

Wenn das letzte Zeichen des Alias-Werts leer ist, wird auch das nächste Befehlswort nach dem Alias ​​auf Alias-Erweiterung überprüft.

Daher reicht es aus, einen Alias cdmit einem zusätzlichen Leerzeichen zu versehen (um das nächste Argument zu erweitern) und dann einen Alias ,,mit ... Siehst du das

alias cd='cd '
alias ,,='..'

gibt genau das was du brauchst.

Beachten Sie, dass dies nicht nur für bash(und dessen aliasImplementierung), sondern für alle POSIX-kompilierten Shells gilt. Zitieren eines Beispiels aus man 1p alias(das Handbuch beschreibt diese Funktion nicht explizit, sondern nur anhand eines Beispiels):

  1. Richten Sie nohup so ein, dass es mit einem Argument umgehen kann, das selbst ein Aliasname ist:

           alias nohup="nohup "

Warnung: Während @PeterCordes in seinen Kommentar schreibt, werden andere Aliase automatisch erweitert, wenn sie nachher geschrieben werden cd. Möglicherweise müssen Sie schreiben, cd \grepwenn Sie das Verzeichnis in ein benanntes Verzeichnis ändern möchten, das grepjedoch grepein Alias ​​für ist grep --color=auto. Ohne den umgekehrten Schrägstrich cdwird der Fehler "zu viele Argumente" gemeldet (Sie können nicht cdzwei Verzeichnisse gleichzeitig aufrufen).

Styroporfliege
quelle
22
Das ist ein kluger, aber böser Hack. Das würde ich nicht wollen. zu leicht, um dich versehentlich zu beißen. Wenn Sie beispielsweise einen Alias ​​für einen Befehl haben, den Sie normalerweise ausführen, und cdin ein Verzeichnis des Quellcodes möchten . Oder andere Kollisionen zwischen Ihren Aliasnamen und allgemeinen Verzeichnisnamen. Gerne cd drwürde sich cd disown -rfür mich mit diesem Pseudonym erweitern. Jedenfalls ist es viel besser, builtin cdmit einer Funktion wie dieser zu überschreiben , IMO.
Peter Cordes
8
+1 für reine Alias-Lösung (ich habe etwas gelernt). Gleichzeitig stimme ich Peters Kommentar zu. Ihrer Antwort sollte eine Art explizite Warnung hinzugefügt werden, denke ich.
Kamil Maciorowski
58

Aliase sind nicht dazu gedacht, aber Sie können eine Funktion mit dem Namen " cdWrapper" für den Real erstellen cd. Dieser arbeitet für mich! Legen Sie es einfach in Ihre .bash_profileoder Ihre Profildatei Ihrer Wahl.

cd () { if [ "$1" = ",," ]; then builtin cd ..; else builtin cd "$@"; fi; }

Oder mit Kommentaren und hübscher Formatierung:

cd ()
{
  if [ "$1" = ",," ]; then  # if first argument is ",,"...
    builtin cd ..           # call the builtin cd with ".." instead...
  else
    builtin cd "$@"         # else call builtin cd with original arguments 
  fi
}

BEARBEITEN

Vielen Dank an @derobert für den Hinweis, dass dies if then elsehier besser ist als && ||. Außerdem habe ich gerade festgestellt ( * facepalm *), dass diese Implementierung nur funktioniert, wenn Nicht-Pfad-Argumente (dh -L -P) nicht das erste Argument sind. Seien Sie also gewarnt, wenn Sie schlechte Tippgewohnheiten haben cd -L ,,, hilft Ihnen dies nicht weiter. Und das ist nicht trivial, denke ich.

BenjiWiebe
quelle
16
@BenjiWiebe Ich denke, die "Kommentare und hübsche Formatierung" -Version wäre besser mit einem Wenn-Dann-Anderen.
zwol
Wow Leute, viele gute Ideen. Wie ich sehe, verwenden Sie die Bearbeitungsfunktion, um die erforderlichen Korrekturen vorzunehmen. Ich habe nicht viel Zeit damit verbracht, es zu testen. :)
BenjiWiebe
1
Alternativ überschreiben Sie einfach, $1bevor Sie das eingebaute Programm ausführen:cd () { [ "$1" = ",," ] && set .. ; cd "$@"; }
Toby Speight,
1
@TobySpeight set .. "${@:2}", oder Sie verlieren nach dem ersten Argument etwas.
Chepner
8
Auch muss technisch ..nicht das erste Argument sein; cdin bashkann eine Vielzahl von Optionen nehmen ( -P, -L, -@, -e).
Chepner
29

Aliase müssen das erste Wort eines Befehls sein. Auch der Alias ​​muss durch ein Wort ersetzt werden ( daher keine Leerzeichen).

Bash-Referenzhandbuch: Aliase

Aliase ermöglichen das Ersetzen eines Wortes durch eine Zeichenfolge, wenn es als erstes Wort eines einfachen Befehls verwendet wird.

Sie könnten beide Alias ..und ,,zu sein cd ...

$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/
Steven
quelle
Genau das mache ich! : D Diese beiden Punkte / Kommas sind viel einfacher zu tippen alscd ..
rav_kr
10
+1, das ist überhaupt keine schlechte Idee. Eine andere Möglichkeit, dies .. in Bash zu tun, besteht darin, shopt -s autocddurch Eingabe des Namens in ein beliebiges Verzeichnis zu wechseln. Natürlich bist du immer noch der ,,
Pseudonym
Ich auch :-)
Joeytwiddle
3

Eine andere Möglichkeit, ..das Verzeichnis zu ändern, besteht darin, die Bash- autocd Funktion zu aktivieren :

shopt -s autocd 

Das wird automatisch das Verzeichnis ändern, wenn Sie den Namen eines eingeben:

~$ /tmp
cd /tmp
/tmp$ 

Sie müssen noch einen Alias ​​für machen, ,,aber das kann mit nur getan werdenalias ,,=..

ilkkachu
quelle
2

Es gibt bereits eine App mit einem Skript dafür: https://github.com/shyiko/commacd (keine Zugehörigkeit zu Stanley Shuyiko).

commacdexportiert drei Befehle: ,(zum Vorwärtsspringen), ,,(rückwärts) und ,,,(rückwärts + vorwärts):

Alle drei versuchen, zuerst nach Präfix abzugleichen. Nur wenn keine Ergebnisse gefunden werden, wird auf die Teilzeichenfolge (Fuzzy) zurückgegriffen

Um Ihre Frage zu beantworten, verwendet das Skript Kommas als Alias ​​für drei Funktionen, die es definiert:

alias ,=_commacd_forward
alias ,,=_commacd_backward
alias ,,,=_commacd_backward_forward
Doktor Dao
quelle