Zjistil jsem, že často dělám následující:
%> cd bla/bla
%> ls
Chtěl bych, aby pokaždé, když cd
do adresáře, automaticky provede ls
.
Hrál jsem se svým .bashrc
na chvíli, ale nedokázali přijít na to, jak se to podaří.
Můžete to provést pomocí funkce:
$ cdls() { cd "[email protected]" && ls; }
The &&
znamená 'cd
do adresáře, a pokud je úspěšný (např. adresář existuje), spusťte ls
'. Za použití &&
operátor je lepší než použití středníku ;
operátor mezi těmito dvěma příkazy, jako u { cd "[email protected]" ; ls; }
. Tento druhý příkaz spustí ls
bez ohledu na to, zda cd
fungoval nebo ne. Pokud cd
selhalo, ls
vytiskne obsah vašeho aktuálního adresáře, což bude pro uživatele matoucí. Jako nejlepší postup použijte &&
a ne ;
.
$ cdls /var/log
CDIS.custom fsck_hfs.log monthly.out system.log
$ pwd
/var/log
Obecně je špatnou praxí přejmenovat příkaz, který již existuje, zejména pro běžně nazývaný příkaz jako cd
. Místo toho vytvořte nový příkaz s jiným názvem. Pokud přepíšete cd
funkcí nebo aliasem, který se také jmenuje cd
, co by se stalo, kdybyste zadali adresář s 100 000 soubory? Existuje mnoho nástrojů, které používají cd
, a mohou být zmateny tímto neobvyklým chováním. Pokud používáte sdílený účet (například root
, když pracujete s jinými správci systému), může být velmi nebezpečné nahradit existující příkaz, protože prostředí se liší od toho, co lidé očekávají.
Mám to ve svém .bashrc a funguje to dobře.
function cd {
builtin cd "[email protected]" && ls -F
}
Dříve v mém .bashrc mám: [ -z "$PS1" ] && return
a vše za tímto řádkem platí pouze pro interaktivní relace, takže to neovlivní, jak se cd
chová ve skriptech.
mimo téma, protože otázka je označena/bash, ale protože některé otázky jsou uzavřeny jako duplikát této otázky, která nezmiňuje bash:
Se zsh:
chpwd() ls
Funkce chpwd () se volá zsh, kdykoli se změní aktuální adresář (pomocí cd, pushd, popd ...). tcsh má podobnou funkci a je pravděpodobně odkud ji zsh získal.
Zkopírujte toto:
altercd(){ cd(){ unset -f cd ; cd $*; ls ; altercd; } } ; altercd
Nyní stačí udělat jednoduché CD:
cd /
(files listed)
cd /home
(files listed)
etc...
Běžné řešení vytváření aliasu pro příkaz cd není dokonalé, protože existují jiné příkazy, které mohou změnit váš aktuální adresář, jako je popd, nebo dokonce spustit skript s příkazem cd v něm.
Je lepší použít háček $ Prompt_COMMAND Bash, který provede příkaz před vrácením výzvy.
Příkaz (funkce v našem případě) se spustí pouze v případě, že se změnil adresář, aby se snížil šum obrazovky. Kód pro .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
V bash se nemůžete vrátit k aliasu pro akci, která vyžaduje parametr. K tomu existují funkce. Takže vložte svůj ~/.bashrc
následující
mycd() {
cd "$1"
ls
}
Vložte níže uvedený kód do .profile a funguje to. Testováno na krabici HP-Unix.
cdl()
{
if [ "$#" = 0 ]; then
cd ~ && ls -ltr
Elif [ -d "[email protected]" ]; then
cd "[email protected]" && ls -ltr
else
echo "[email protected]" directory not found!!!
fi
}
#SET YOUR ALIAS TO CD
alias cd="cdl"
Myslím, že je dobré povolit možnosti ls
, protože cd
nemá žádnou možnost.
cdls() {
cd ${$#} && ls ${@:0:$#-1}
}
Ještě užitečnější - se schopností vrátit se do historie:
function cd() {
if [ -d "[email protected]" ]; then
echo -n "Stack: "
pushd "[email protected]"
ls
else
builtin cd "[email protected]"
fi
}
function popd() {
builtin popd "[email protected]" && ls
}
Když změníte adresář, zobrazí se řádek s: Stack: (current_dir) (previous_dir) ...
, potom ls
output. Chcete-li se vrátit zpět do historie dirů, zadejte tento příkaz: popd
.
Přidal jsem else
, takže se při pokusu o přechod do nesprávného adresáře zobrazí chyba.
Zde je to, co mi připadá užitečné (na Debianu 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
'
}
To mi dává zkrácený výstup s Ellipsis pro případ, že je v adresáři příliš mnoho položek, takže konzole zůstane čistá:
$ 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