it-swarm-eu.dev

Vytvořte CD automaticky ls

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ří.

51
RobKohr

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í.

54

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.

42
frabjous

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.

16

Proč do alba .bashrc přidat alias?

Něco jako:

alias cdls='cd "[email protected]" && ls'
4
Kenneth Aar

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
2
Jack

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
}
1
enzotib

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"
0
user196161

Myslím, že je dobré povolit možnosti ls, protože cd nemá žádnou možnost.

cdls() {
  cd ${$#} && ls ${@:0:$#-1}
}
0
iBug

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.

0
Ctrl-C

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
0
Superlexx