Wie kann man mit "cd ..." zwei Verzeichnisse erstellen?

944
Jimmy Huch

Also, derzeit auf MacOS habe ich Aliase wie folgt eingerichtet ...

alias ...='cd ../..' alias ....='cd ../../..' 

Dadurch kann ich mehrere Verzeichnisse aufrufen, indem ...ich mein Terminal eingebe. In meinem vorherigen Setup hatte ich jedoch cd ...die Möglichkeit, mehrere Verzeichnisse aufzurufen. Am cdAnfang werde ich geschult, um zu schreiben ... wie kann ich meine Aliase so ändern, dass sie so funktionieren, wie ich es wünsche?

1

2 Antworten auf die Frage

1
Hartmut Braun

Mit Hilfe von https://stackoverflow.com/questions/941338/how-to-pass-command-line-arguments-to-a-shell-alias kann Ihr Problem folgendermaßen gelöst werden:

alias cd='function _cd(){ cd $; }; _cd ' 

Die Parametererweiterung in der Funktion ersetzt alle Vorkommen von '...' durch '../ ..', ist also keine wirklich saubere Lösung, aber ich denke, dass sie noch akzeptabel ist oder verbessert werden kann.

0
Kamil Maciorowski

Sie dürfen keinen Aliasnamen mit Leerzeichen haben. Um mit Aliases das zu tun, was Sie möchten, müssen Sie diese Eigenschaft nutzen:

Wenn der Wert des Alias, der das Wort ersetzt, in einem <Leerzeichen> endet, überprüft die Shell das nächste Befehlswort auf Alias-Ersetzung. Dieser Vorgang wird fortgesetzt, bis ein Wort gefunden wird, das kein gültiger Alias ​​ist oder ein Aliaswert nicht mit einem <Leerzeichen> endet.

( source ), so cd und fortlaufend ...werden als Aliase aufgelöst.

Sie brauchen Aliase wie diese:

cd='cd ' ...='../..' ....='../../..' # and so on 

Wenn Sie jedoch ein Verzeichnis mit dem Namen lsund die Eingabe erhalten cd ls, lsneigen Sie auch dazu, einen Alias ​​zu ersetzen. Wenn lsein Alias ​​ist, wird dies fehlschlagen.

Pure Alias ​​Ansatz ist daher falsch. Diese Funktion erfüllt (verwenden Sie es ohne die obigen Aliase):

cd() { if [ "$#" -eq 0 ]; then command cd elif [ "$(printf '%s' "$1" | wc -l)" -eq 0 ]; then command cd "$(printf '%s' "$1" | sed '/^\.\.\+$/ ')"; else command cd "$1" fi } 

sedholt das Argument an die Funktion und ändert es, wenn es aus zwei oder mehr Punkten besteht; Das Werkzeug entfernt den ersten Punkt und ersetzt jeden Punkt (der übrig bleibt) durch ../.

Es gibt zusätzliche Logik:

  • [ "$#" -eq 0 ]erlaubt die Sohle cd(ohne Argumente) so zu arbeiten, wie sie sollte.
  • [ "$(printf '%s' "$1" | wc -l)" -eq 0 ]ist zu verhindern sedmehrzeiligen Verzeichnisnamen (zB zu ändern, foo<newline>.....die ist ein gültiger Name). Beachten Sie, dass bei normalen Namen (die keine Zeilenumbrüche enthalten) wc -lRückgaben enthalten 0(nicht 1, POSIX betrachtet eine "Zeile" nicht, ohne die Zeilenumbrüche zu beenden), daher testen wir es mit 0.

Und es gibt eine Eigenart:

  • Bei s|..|.|den ersten beiden Punkten handelt es sich nicht um wörtliche Punkte, sondern um reguläre Ausdrücke. Man kann sagen, dass es sein sollte, s|\.\.|.|aber es /^\.\.\+$/stellt sicher, dass es in der Zeile nur Punkte gibt. Gleiches gilt für den ersten Punkt s|.|../|g.
Warum machen Sie `` printf '% s' "$ 1" | `` anstelle von `` <<< "$ 1" ``? Nur für POSIX? Scott vor 5 Jahren 0
@Scott Ja, für POSIX. Mein erster (nicht veröffentlichter) Entwurf verwendete "<<<". Kamil Maciorowski vor 5 Jahren 0