Wie kann ich einen Alias ​​für cd und ls erstellen?

32

Ich führe den lsBefehl häufig aus, nachdem ich ihn ausgeführt habe cd. Wie kann ich einen Alias ​​(wie cs) für diesen Vorgang erstellen ?

dv3500ea
quelle

Antworten:

35

Aus Bash Tips and Tricks: 'CD' mit Stil :

Abschließend möchte ich Ihnen zeigen, wie Sie Ihren eigenen benutzerdefinierten Ersatz für den Befehl 'cd' schreiben.

Stellen Sie fest, dass Sie beim Wechseln in ein Verzeichnis immer dasselbe eingeben? Wahrscheinlich listen Sie die Dateien dort jedes Mal auf, vielleicht so oft, dass Ihre Hände automatisch nach jeder 'CD' 'ls' eingeben.

Nun, wenn ich alles versuche, was mir einfällt, zeigt sich, dass es nur einen Weg gibt, das angestrebte Ziel richtig zu erreichen. Wir müssen eine Shell-Funktion erstellen.

Shell-Funktionen sind Teil der Shell-Programmierung. Funktionen bieten wie in kompilierten Programmiersprachen eine Art prozedurale Modularisierbarkeit. Man kann eine generische Funktion erstellen, um ein häufig verwendetes Stück Logik oder Berechnung mit verschiedenen Parametern durchzuführen. In diesem Fall ist der Parameter das aktuelle Arbeitsverzeichnis.

Hier ist eine einfache:

function cs () {
    cd $1
    ls
}

Wie @geirha genau feststellt, schlägt die obige Funktion fehl, wenn Sie versuchen, zu einem Verzeichnis mit einem Leerzeichen im Namen zu wechseln:

$ cs A\ B/
-bash: cd: A: No such file or directory
<current directory listing>  

Sie sollten stattdessen die folgende Funktion verwenden:

function cs () {
    cd "$@" && ls
    }

Sobald Sie diesen Code hinzugefügt haben, ~/.bashrcsollten Sie in der Lage sein, dies zu tun:

hello@world:~$ cs Documents/
example.pdf tunafish.odt
hello@world:~/Documents$
Jesaja
quelle
1
Bei Verzeichnissen mit Leerzeichen schlägt dies fehl. Siehe den Kommentar zu dv3500eas Antwort.
Geirha
24

Sie können den builtinBefehl in bash verwenden:

function cd() {
    new_directory="$*";
    if [ $# -eq 0 ]; then 
        new_directory=${HOME};
    fi;
    builtin cd "${new_directory}" && ls
}
OneOfOne
quelle
2
Das ist ziemlich schlau. Ich hatte sehr lange eine ähnliche Lösung wie @Florian in meinem .bashrc, aber dies ist viel befriedigender, wenn ich vergesse, dass Kollegen keinen Aliasnamen für mein "cs" auf ihren Computern haben.
Dino
Mir gefällt diese Antwort am besten. Aus irgendeinem Grund können Sie zum Überschreiben des Befehls keine Aliase verwenden, daher müssen Sie eine Funktion wie diese Antwort erstellen. : D
trusktr
Aber was ist mit nicht eingebauten Befehlen? Das oben beschriebene Verfahren funktioniert beispielsweise nicht zum Überschreiben des Befehls ls. Gibt es ein Schlüsselwort anstelle von "builtin"?
Trusktr
Verwenden Sie den vollständigen Pfad, zum Beispiel:function ls() { /usr/bin/ls $* }
OneOfOne 31.10.12
Ich hatte Probleme bei der Neudefinition, cdweil rvmsich auch meine cdDefinition geändert hat . Siehe stackoverflow.com/a/19941991/1601989
DavidG,
16

Verwenden Sie eine Funktion anstelle eines Alias:

cs() { cd "$1" && ls; }
Florian Diesch
quelle
5
+1, da diese Version stoppt, wenn 'cd' fehlschlägt.
htorque
9

Danke Florian Diesch für den Tipp, eine Funktion zu benutzen. Ich kann csden Namen nicht verwenden, da das csound- Paket einen csBefehl enthält , den ich verwendet habe lc.

Ich habe dies zu ~/.bash_aliases( nano ~/.bash_aliases) hinzugefügt :

function lc () {
    cd $1;
    ls 
}

Das Terminal muss dafür eingerichtet sein reset.

dv3500ea
quelle
8
Wenn Sie das $1nicht tun, schlägt es fehl, wenn das Verzeichnis Leerzeichen enthält. Außerdem sollten Sie den Rückgabewert von prüfen cd. Wenn es fehlgeschlagen ist (z. B. die Erlaubnis verweigert wurde), macht es keinen Sinn, das auszuführen ls. lc() { cd "$@" && ls; }
Geirha
1

Als Erweiterung dieser Funktion: cs() { cd "$1" && ls; }, können Sie auf alle die Argumente der Funktion zu übergeben cddurch die Verwendung $@von anstelle "$1"als solche: cs() { cd $@ && ls; }.


quelle
1

Ich hatte Probleme bei der Neudefinition, cdweil rvmsich auch meine cdDefinition geändert hat . Siehe https://stackoverflow.com/a/19941991/1601989 . Ich wollte nicht wirklich verwenden, builtinweil das alles überspringen würde, was gerade gemacht rvmwird.

Ich habe Folgendes zu meinem hinzugefügt .bashrc:

# cdd allows you to cd to the directory of the given file or directory
function cdd()
{
  if [[ $# -eq 0 ]]; then
    cd
  elif [[ -d "$*" ]]; then
    cd "$*"
  elif [[ -f "$*" ]]; then
    echo "WARNING: file given, cd to file's dirname" 1>&2
    local dir=$(dirname "$*")
    cd "$dir"
  else
    cd "$*"
  fi
}

function cs()
{
  cdd $* && ls
}

Und dann nach der rmvZeile in der .bashrc:

alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd
DavidG
quelle