CD automatisch erstellen ls

46

Ich finde, dass ich oft Folgendes mache:

%> cd bla/bla
%> ls

Ich würde es begrüßen, wenn ich cdin ein Verzeichnis automatisch eine ls.

Ich habe .bashrceine Weile mit meinem herumgespielt , konnte aber nicht herausfinden, wie ich das erreichen kann.

RobKohr
quelle

Antworten:

50

Sie können dies mit einer Funktion tun:

$ cdls() { cd "$@" && ls; }

Das &&bedeutet ' cdin ein Verzeichnis und wenn erfolgreich (zB das Verzeichnis existiert), ausführen ls'. Die Verwendung des &&Operators ist besser als die Verwendung eines Semikolon- ;Operators zwischen den beiden Befehlen, wie bei { cd "$@" ; ls; }. Dieser zweite Befehl wird ausgeführt, lsunabhängig davon, ob er cdfunktioniert hat oder nicht. Wenn dies cdfehlschlägt, lswird der Inhalt Ihres aktuellen Verzeichnisses gedruckt, was für den Benutzer verwirrend ist. Als Best Practice verwenden &&und nicht ;.

$ cdls /var/log
CDIS.custom     fsck_hfs.log    monthly.out     system.log
$ pwd
/var/log

Im Allgemeinen ist es eine schlechte Praxis, einen bereits vorhandenen Befehl umzubenennen, insbesondere für einen allgemein aufgerufenen Befehl wie cd. Erstellen Sie stattdessen einen neuen Befehl mit einem anderen Namen. Wenn Sie cdmit einer Funktion oder einem Alias überschreiben, der auch benannt ist cd, was würde passieren, wenn Sie ein Verzeichnis mit 100.000 Dateien eingeben? Es gibt viele Dienstprogramme, die verwendet werden cd, und sie können durch dieses ungewöhnliche Verhalten verwirrt werden. Wenn Sie ein freigegebenes Konto verwenden (z. B. rootwenn Sie mit anderen Systemadministratoren arbeiten), kann es sehr gefährlich sein, einen vorhandenen Befehl zu ersetzen, da sich die Umgebung von den Erwartungen der Benutzer unterscheidet.

Stefan Lasiewski
quelle
Dieser Befehl wirklich das Verzeichnis wechseln? Aus der man page von bash: "Es gibt keinen Mechanismus für die Verwendung von Argumenten im Ersetzungstext. Wenn Argumente benötigt werden, sollte eine Shell-Funktion verwendet werden"
enzotib
@enzotib: Ja, das ändert wirklich das Verzeichnis, zumindest für mich. Ich habe meine Antwort aktualisiert, um die Ausgabe von anzuzeigen pwd. Ich bin nicht sicher, ob dies eine bewährte Methode ist, aber sie wird häufig angewendet. Einige Beispiele finden Sie unter tldp.org/LDP/abs/html/aliases.html .
Stefan Lasiewski
2
Erstens: es funktioniert hier nicht. Zweitens: Auf dieser Seite werden Variablen und keine Positionsparameter verwendet. Drittens: ABS ist eine häufige Ursache für schlechte Praktiken.
Enzotib
1
Der Alias ​​funktioniert für mich auf Snow Leopard, aber nicht auf CentOS5 oder CentOS6. Ich habe meine Antwort aktualisiert, um nur eine Funktion zu verwenden. Keine Aliase.
Stefan Lasiewski
1
Funktioniert bei mir nicht. Versucht @frabjous Antwort und es funktioniert: cd() { builtin cd "$@" && pwd; };- Mit Standard-Borowski-Shell auf MacOS (Sierra 10.12.6)
Swivel
39

Ich habe dies in meinem .bashrc, und es funktioniert gut.

function cd {
    builtin cd "$@" && ls -F
    }

Früher in meinem .bashrc habe ich: [ -z "$PS1" ] && returnund alles nach dieser Zeile gilt nur für interaktive Sitzungen, daher hat dies keine Auswirkungen auf das Verhalten cdin Skripten.

schäbig
quelle
1
Was genau macht [ -z "$PS1" ] && returndas?
Syntagma
2
[ -z "$PS1" ]prüft, ob die $PS(interaktive Eingabeaufforderungsvariable) "Nulllänge" (-z) ist. Wenn die Länge Null ist, bedeutet dies, dass sie nicht festgelegt wurde, sodass Bash nicht im interaktiven Modus ausgeführt werden darf. Unter diesen Bedingungen wird das && returnTeil .bashrcan dieser Stelle aus der Beschaffung genommen .
Frabjous
1
Eine weitere Möglichkeit zur Interaktivität zu überprüfen , ist zu suchen iin "$-": case "$-" in *i*) ;; *) return ;; esac.
Kusalananda
@Kusalananda & frabjous: Gibt es Fälle, in denen einer anstelle des anderen verwendet werden sollte?
Schwenk
1
@Swivel Die PS1Variable ist möglicherweise nicht gesetzt oder leer, und die Shell ist möglicherweise noch interaktiv (jedoch ohne Eingabeaufforderung). Ich würde das überprüfen $-, um sicherzugehen.
Kusalananda
13

Off-Topic, da die Frage mit / bash markiert ist, aber da einige Fragen als Duplikat dieser Frage geschlossen sind, die bash nicht erwähnen:

Mit zsh:

chpwd() ls

Die Funktion chpwd () wird von zsh aufgerufen, wenn sich das aktuelle Verzeichnis ändert (über cd, pushd, popd ...). tcsh hat eine ähnliche Funktion und ist wahrscheinlich der Ort, von dem zsh sie erhalten hat.

Stéphane Chazelas
quelle
4

Warum nicht einen Alias ​​zu Ihrer .bashrc-Datei hinzufügen?

So etwas wie:

alias cdls='cd "$@" && ls'
Kenneth Aar
quelle
@don_crissti Eine Funktion und ein Alias ​​sind verschiedene Dinge. Also warum nicht?
Jodka Lemon
Dies ist die schnellste und sauberste Methode, um die Anforderungen des OP zu erfüllen. Meiner Meinung nach sollten Funktionen für kompliziertere Dinge verwendet werden, während Verknüpfungen für häufig getippte Befehle genau das sind, wofür Aliase existieren.
Ghos3t
Ich habe ein seltsames Problem mit diesem Alias, wenn ich es so benutze, cdls projec2, werden alle Dateien im Projekt 2-Ordner angezeigt, aber keine CDs in diesem Ordner, sondern es verbleibt im ursprünglichen Ordner.
Ghos3t
2

Die übliche Lösung zum Erstellen eines Alias ​​für den Befehl cd ist nicht perfekt, da es andere Befehle gibt, die Ihr aktuelles Verzeichnis ändern können, z. B. popd, oder sogar ein Skript mit dem Befehl cd ausführen.

Es ist besser, den $ PROMPT_COMMAND-Bash-Hook zu verwenden, der einen Befehl ausführt, bevor eine Eingabeaufforderung zurückgegeben wird.

Der Befehl (in unserem Fall eine Funktion) wird nur dann ausgeführt, wenn das Verzeichnis geändert wurde, um das Bildschirmrauschen zu verringern. Code für .bashrc:

    #each console has its own file to save PWD
    PrevDir=$(tty) 
    PrevDir=/tmp/prev-dir${PrevDir////-}
    #don't ls when shell launched
    echo $PWD > $PrevDir
    LsAfterCd() {
        [[ "$(< $PrevDir)" == "$PWD" ]] && return 0

        ll --color=always | sed 1d

        echo $PWD > $PrevDir
    }
    PROMPT_COMMAND=LsAfterCd
Jack
quelle
2

Kopier das:

altercd(){ cd(){ unset -f cd ; cd $*; ls ; altercd; } } ; altercd 

Jetzt können Sie einfach eine CD machen:

cd / 
(files listed)
cd /home 
(files listed)
etc... 
Luciano Andress Martini
quelle
1

In Bash können Sie keine Aliase für Aktionen wiederholen, für die Parameter erforderlich sind. Dafür gibt es Funktionen. Geben Sie also ~/.bashrcFolgendes ein

mycd() {
  cd "$1"
  ls
}
Enzotib
quelle
4
cd "$1" && lswäre besser.
Gilles 'SO- hör auf böse zu sein'
Um einen Parameter für den Befehl ls zuzulassen, verwende ich die Funktion mycd {builtin cd $ 1 && ls $ 2}. Jetzt können Sie den Befehl aufrufen, zB mycd .. -la
Christian Schulzendorff
@ChristianSchulzendorff: besser die Anführungszeichen zu verwenden: function mycd { builtin cd "$1" && ls "$2" } .
Enzotib
Funktioniert nicht, ich habe es einfach versucht. Die Datei war leer, aber nach dem Hinzufügen des Codes hat sich nichts geändert.
Black
0

Fügen Sie den folgenden Code in das .profile ein und es funktioniert. Getestet auf HP-Unix-Box.

cdl()
{
if [ "$#" = 0 ]; then
cd ~ && ls -ltr
elif [ -d "$@" ]; then
cd "$@" && ls -ltr
else
echo "$@" directory not found!!!
fi
}

#SET YOUR ALIAS TO CD
alias cd="cdl"
user196161
quelle
0

Noch praktischer - mit der Fähigkeit, in die Geschichte zurückzugehen :

function cd() {
    if [ -d "$@" ]; then
        echo -n "Stack: "
        pushd "$@"
        ls
    else
        builtin cd "$@"
    fi
}
function popd() {
    builtin popd "$@" && ls
}

Wenn Sie das Verzeichnis wechseln, wird eine Zeile mit: Stack: (current_dir) (previous_dir) ...angezeigt und dann lsausgegeben. In dirs nur diesen Befehl Pop - Geschichte zurück zu gehen: popd.

Ich habe hinzugefügt, elsedamit beim Versuch, in ein falsches Verzeichnis zu wechseln, ein Fehler angezeigt wird.

Strg-C
quelle
Wenn Sie nur eine CD machen, gelangen Sie zu Ihrem letzten Verzeichnis, in dem Sie sich befanden.
Ian,
0

Ich denke, es ist gut, die lsOptionen auf diese Weise zu aktivieren , da cdkeine Option erforderlich ist.

cdls() {
  cd ${$#} && ls ${@:0:$#-1}
}
iBug
quelle
Umm ... cdnimmt Optionen.
Kusalananda
0

Folgendes finde ich nützlich (unter Debian 9):

c() {
    cd "${@}" \
    && ls --color=always -C \
    | sed '
        # on line 5, print the line,
        5 {
            # append an ellipsis
            a[...]
            # and quit
            q
        }
        # print lines 1-4 verbatim
    '
}

Dies gibt mir eine gekürzte Ausgabe mit Auslassungspunkten, falls sich zu viele Elemente in diesem Verzeichnis befinden, damit die Konsole sauber bleibt:

$ c data/git/buildroot/package/
4th                              lua-markdown
a10disp                          lua-messagepack
acl                              lua-msgpack-native
acpica                           luaossl
acpid                            lua-periphery
[...]
$ ls -1 | wc --lines
1977
Superlexx
quelle
-1
alias cd='builtin cd $1 && ls -l && builtin cd $1'
joek
quelle
Dazu kommt nichts, was die anderen Antworten noch nicht abgedeckt haben.
Jasonwryan