Odpowiedzi:
Możesz to zrobić za pomocą funkcji:
$ cdls() { cd "$@" && ls; }
Te &&
środki „ cd
do katalogu, a jeśli się powiedzie (na przykład katalog istnieje), Run ls
”. Użycie &&
operatora jest lepsze niż użycie ;
operatora średnika między dwiema komendami, jak w przypadku { cd "$@" ; ls; }
. To drugie polecenie będzie działać ls
niezależnie od tego, czy cd
zadziałało, czy nie. Jeśli się cd
nie powiedzie, ls
wydrukuje zawartość twojego bieżącego katalogu, co będzie mylące dla użytkownika. Jako najlepszą praktykę używaj &&
i nie ;
.
$ cdls /var/log
CDIS.custom fsck_hfs.log monthly.out system.log
$ pwd
/var/log
Ogólnie rzecz biorąc, złą praktyką jest zmiana nazwy polecenia, które już istnieje, szczególnie w przypadku często nazywanego polecenia, takiego jak cd
. Zamiast tego utwórz nowe polecenie o innej nazwie. Jeśli zastąpisz cd
funkcję lub alias o nazwie cd
, co się stanie, gdy wejdziesz do katalogu zawierającego 100 000 plików? Istnieje wiele narzędzi, z których można korzystać cd
i mogą się mylić z powodu tego niezwykłego zachowania. Jeśli korzystasz ze wspólnego konta (na przykład root
podczas pracy z innymi administratorami systemu), zastąpienie istniejącego polecenia może być bardzo niebezpieczne, ponieważ środowisko różni się od oczekiwań ludzi.
pwd
. Nie jestem pewien, czy jest to najlepsza praktyka, ale często się to odbywa. Zobacz przykłady tldp.org/LDP/abs/html/aliases.html .
cd() { builtin cd "$@" && pwd; };
- używając standardowej powłoki Bourne'a w systemie macOS (Sierra 10.12.6)
Mam to w moim .bashrc i działa dobrze.
function cd {
builtin cd "$@" && ls -F
}
Wcześniej w moim .bashrc mam: [ -z "$PS1" ] && return
i wszystko po tym wierszu dotyczy tylko sesji interaktywnych, więc nie wpływa to na cd
zachowanie skryptów.
[ -z "$PS1" ] && return
?
[ -z "$PS1" ]
sprawdza, czy $PS
(interaktywna zmienna zachęty) ma „zerową długość” (-z). Jeśli ma zerową długość, oznacza to, że nie została ustawiona, więc Bash nie może działać w trybie interaktywnym. && return
Część wychodzi z zaopatrywaniu .bashrc
w tym momencie, w tych warunkach.
i
w "$-"
: case "$-" in *i*) ;; *) return ;; esac
.
PS1
Zmienna może być rozbrojona lub pusta, a powłoka może być nadal interaktywna (ale bez monitu). Sprawdziłbym, $-
żeby się upewnić.
nie na temat, ponieważ pytanie jest oznaczone / bash, ale ponieważ niektóre pytania są zamknięte jako duplikat tego, który nie wspomina o bash:
Z zsh:
chpwd() ls
Funkcja chpwd () jest wywoływana przez zsh za każdym razem, gdy zmienia się bieżący katalog (za pomocą cd, pushd, popd ...). tcsh ma podobną funkcję i prawdopodobnie jest tam, skąd Zsh go otrzymał.
Dlaczego nie dodać aliasu do pliku .bashrc?
Coś jak:
alias cdls='cd "$@" && ls'
Powszechne rozwiązanie tworzenia aliasu dla polecenia cd nie jest idealne, ponieważ istnieją inne polecenia, które mogą zmienić bieżący katalog, np. Popd, a nawet uruchomić skrypt z poleceniem cd.
Lepiej użyć $ PROMPT_COMMAND haka Bash, który wykonuje polecenie przed zwróceniem monitu.
Polecenie (w naszym przypadku funkcja) wykona ls tylko wtedy, gdy katalog został zmieniony w celu zmniejszenia szumów na ekranie. Kod .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
Skopiuj to:
altercd(){ cd(){ unset -f cd ; cd $*; ls ; altercd; } } ; altercd
Teraz możesz po prostu zrobić prostą płytę CD:
cd /
(files listed)
cd /home
(files listed)
etc...
W bash nie można powracać do aliasów dla akcji wymagających parametru. Do tego są funkcje. Wpisz więc ~/.bashrc
następujące informacje
mycd() {
cd "$1"
ls
}
function mycd { builtin cd "$1" && ls "$2" }
.
Umieść poniższy kod w .profile i działa. Testowany na komputerze HP-Unix.
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"
Jeszcze bardziej przydatny - z możliwością powrotu do historii :
function cd() {
if [ -d "$@" ]; then
echo -n "Stack: "
pushd "$@"
ls
else
builtin cd "$@"
fi
}
function popd() {
builtin popd "$@" && ls
}
Po zmianie katalogu pojawi się wiersz z Stack: (current_dir) (previous_dir) ...
:, a następnie ls
wyjście. Aby wrócić katalogów historia po prostu pop polecenia: popd
.
Dodałem, else
więc zobaczysz błąd podczas próby przejścia do niewłaściwego katalogu.
Myślę, że dobrze jest włączyć ls
opcje w ten sposób, ponieważ cd
nie ma opcji.
cdls() {
cd ${$#} && ls ${@:0:$#-1}
}
cd
bierze opcje.
Oto, co uważam za przydatne (w Debianie 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
'
}
Daje mi to obcięte dane wyjściowe z wielokropkiem na wypadek, gdyby w tym katalogu było zbyt wiele elementów, aby konsola pozostała czysta:
$ 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'