Antworten:
Sie können dies mit einer Funktion tun:
$ cdls() { cd "$@" && ls; }
Das &&
bedeutet ' cd
in 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, ls
unabhängig davon, ob er cd
funktioniert hat oder nicht. Wenn dies cd
fehlschlägt, ls
wird 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 cd
mit 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. root
wenn 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.
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 .
cd() { builtin cd "$@" && pwd; };
- Mit Standard-Borowski-Shell auf MacOS (Sierra 10.12.6)
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" ] && return
und alles nach dieser Zeile gilt nur für interaktive Sitzungen, daher hat dies keine Auswirkungen auf das Verhalten cd
in Skripten.
[ -z "$PS1" ] && return
das?
[ -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 && return
Teil .bashrc
an dieser Stelle aus der Beschaffung genommen .
i
in "$-"
: case "$-" in *i*) ;; *) return ;; esac
.
PS1
Variable 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.
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.
Warum nicht einen Alias zu Ihrer .bashrc-Datei hinzufügen?
So etwas wie:
alias cdls='cd "$@" && ls'
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
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...
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 ~/.bashrc
Folgendes ein
mycd() {
cd "$1"
ls
}
function mycd { builtin cd "$1" && ls "$2" }
.
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"
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 ls
ausgegeben. In dirs nur diesen Befehl Pop - Geschichte zurück zu gehen: popd
.
Ich habe hinzugefügt, else
damit beim Versuch, in ein falsches Verzeichnis zu wechseln, ein Fehler angezeigt wird.
Ich denke, es ist gut, die ls
Optionen auf diese Weise zu aktivieren , da cd
keine Option erforderlich ist.
cdls() {
cd ${$#} && ls ${@:0:$#-1}
}
cd
nimmt Optionen.
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
alias cd='builtin cd $1 && ls -l && builtin cd $1'