Crea cd automaticamente ls


47

Trovo che spesso faccio quanto segue:

%> cd bla/bla
%> ls

Mi piacerebbe che ogni volta che entrassi cdin una directory lo facesse automaticamente ls.

Ho armeggiato con il mio .bashrcper un po ', ma non sono riuscito a capire come farlo accadere.

Risposte:


51

Puoi farlo con una funzione:

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

I &&mezzi ' cdin una directory, e se (ad esempio, esiste la directory) di successo, run ls'. Usare l' &&operatore è meglio quindi usare un ;operatore punto e virgola tra i due comandi, come con { cd "$@" ; ls; }. Questo secondo comando verrà eseguito lsindipendentemente dal fatto che abbia cdfunzionato o meno. In caso cdcontrario, lsstamperà il contenuto della directory corrente, che sarà fonte di confusione per l'utente. Come best practice, usa &&e non ;.

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

In generale, è una cattiva pratica rinominare un comando che esiste già, specialmente per un comando comunemente chiamato come cd. Invece, crea un nuovo comando con un nome diverso. Se si sovrascrive cdcon una funzione o un alias che è anche chiamato cd, cosa accadrebbe quando si accede a una directory con 100.000 file? Ci sono molte utility che usano cde possono essere confuse da questo comportamento insolito. Se si utilizza un account condiviso (come rootquando si lavora con altri amministratori di sistema), può essere molto pericoloso sostituire un comando esistente perché l'ambiente è diverso da quello che le persone si aspettano.


Quel comando cambia davvero directory? Dalla pagina man di bash: "Non c'è alcun meccanismo per usare gli argomenti nel testo sostitutivo. Se sono necessari argomenti, dovrebbe essere usata una funzione shell"
enzotib

@enzotib: Sì, questo cambia davvero directory, almeno per me. Ho aggiornato la mia risposta per mostrare l'output di pwd. Non sono sicuro se questa è una buona pratica, ma è comunemente fatta. Vedi tldp.org/LDP/abs/html/aliases.html per alcuni esempi.
Stefan Lasiewski,

2
Primo: non funziona qui. Secondo: in quella pagina usano variabili, non parametri posizionali. Terzo: l'ABS è una fonte comune di cattive pratiche.
enzotib,

1
L'alias funziona per me su Snow Leopard ma non su CentOS5 o CentOS6. Ho aggiornato la mia risposta per utilizzare solo una funzione. Nessun alias.
Stefan Lasiewski,

1
Non funziona per me. Ho provato la risposta @frabjous e funziona: cd() { builtin cd "$@" && pwd; };- usando la shell bourne standard su macOS (Sierra 10.12.6)
Swivel

39

Ho questo nel mio .bashrc e funziona benissimo.

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

In precedenza nel mio .bashrc ho:, [ -z "$PS1" ] && returne tutto ciò che segue quella riga si applica solo alle sessioni interattive, quindi questo non influisce sul cdcomportamento degli script.


1
Che cosa fa esattamente [ -z "$PS1" ] && return?
syntagma,

2
[ -z "$PS1" ]controlla se la $PS(variabile prompt interattiva) è "lunghezza zero" (-z). Se ha una lunghezza pari a zero, significa che non è stato impostato, quindi Bash non deve essere in esecuzione in modalità interattiva. La && returnparte esce dall'approvvigionamento .bashrca questo punto, in queste condizioni.
frabjous

1
Un altro modo per verificare l'interattività è quello di cercare iin "$-": case "$-" in *i*) ;; *) return ;; esac.
Kusalananda

@Kusalananda & frabjous: ci sono casi in cui uno dovrebbe essere usato al posto dell'altro?
Girevole il

1
@Swivel La PS1variabile potrebbe essere non impostata o vuota e la shell potrebbe essere comunque interattiva (ma senza un prompt). Vorrei verificare $-per essere sicuro.
Kusalananda

13

off-topic, poiché la domanda è taggata / bash, ma poiché alcune domande sono chiuse come duplicate di questa che non menziona bash:

Con zsh:

chpwd() ls

La funzione chpwd () viene chiamata da zsh ogni volta che cambia la directory corrente (tramite cd, pushd, popd ...). tcsh ha una funzione simile ed è probabilmente da dove zsh l'ha preso.


4

Perché non aggiungere un alias al tuo file .bashrc?

Qualcosa di simile a:

alias cdls='cd "$@" && ls'

@don_crissti Una funtion e un alias sono cose diverse. Quindi perche no?
Jodka Lemon,

Questo è il modo più rapido e pulito di fare ciò che l'OP ha richiesto. Secondo me, le funzioni dovrebbero essere usate per cose più complicate, mentre fare scorciatoie per comandi spesso digitati è esattamente ciò per cui esistono gli alias.
Ghos3t

1
Ho uno strano problema con questo alias, quando lo uso in questo modo, cdls projec2, mostrerà tutti i file nella cartella del progetto 2 ma in realtà non cd in quella cartella, invece rimarrà nella cartella originale.
Ghos3t,

Sì, l'uso di un alias elenca semplicemente i contenuti in quella directory, ma in realtà non esegue il cd.
a3y3

2

La soluzione comune di creare un alias per il comando cd non è perfetta perché ci sono altri comandi che possono cambiare la directory corrente come popd o persino eseguire uno script con il comando cd al suo interno.

È meglio utilizzare $ PROMPT_COMMAND Bash hook che esegue un comando prima di restituire un prompt.

Il comando (una funzione nel nostro caso) eseguirà ls solo se la directory è cambiata per ridurre il rumore dello schermo. Codice per .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

Copia questo:

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

Ora puoi semplicemente fare un semplice cd:

cd / 
(files listed)
cd /home 
(files listed)
etc... 

1

In bash non è possibile ricorrere ad alias per azioni che richiedono parametri. Per questo ci sono funzioni. Quindi inserisci ~/.bashrcil seguente

mycd() {
  cd "$1"
  ls
}


Per consentire un parametro per il comando ls, utilizzo la funzione mycd {builtin cd $ 1 && ls $ 2}. Ora puoi chiamare il comando ad es. Mycd .. -la
Christian Schulzendorff,

@ChristianSchulzendorff: meglio usare le virgolette: function mycd { builtin cd "$1" && ls "$2" } .
enzotib,

Non funziona, l'ho appena provato. Il file era vuoto, ma dopo aver aggiunto il codice, nulla è cambiato.
Nero,

0

Inserisci il codice qui sotto nel .profile e funziona. Testato su scatola 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"

0

Ancora più utile - con la possibilità di tornare indietro nella storia :

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

Quando si cambia directory Stack: (current_dir) (previous_dir) ...verrà visualizzata una riga con :, quindi lsoutput. Per tornare in dirs storia basta inserire questo comando: popd.

Ho aggiunto elsequindi vedrai un errore quando provi ad andare in una directory sbagliata.


se fai semplicemente cd - ti porterà alla tua ultima reg in cui ti trovavi.
Ian

0

Penso che sia bene abilitare lsle opzioni in questo modo in quanto cdnon richiede opzioni.

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

Umm ... cdprende opzioni.
Kusalananda

0

Ecco cosa trovo utile (su 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
    '
}

Questo mi dà l'output troncato con i puntini di sospensione nel caso in cui ci siano troppi elementi in quella directory in modo che la console rimanga pulita:

$ 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

-1
alias cd='builtin cd $1 && ls -l && builtin cd $1'

Questo non aggiunge nulla che le altre risposte non abbiano già coperto.
Jasonwryan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.