Risposte:
A partire dal Bash Tips and Tricks: 'cd' con stile :
Infine, voglio mostrarti come scrivere il tuo sostituto personalizzato per il comando 'cd'.
Ti ritrovi a digitare sempre la stessa cosa quando cambi in una directory? Probabilmente almeno elenchi i file lì ogni volta, forse così tanto che le tue mani digitano automaticamente 'ls' dopo ogni 'cd'.
Bene, provando ogni modo che mi viene in mente, si scopre che c'è solo un modo per raggiungere correttamente l'obiettivo che stiamo cercando. Dobbiamo creare una funzione shell.
Le funzioni della shell fanno parte della programmazione della shell. Come nei linguaggi di programmazione compilati, le funzioni forniscono una sorta di modularizzabilità procedurale. È possibile creare una funzione generica per eseguire un bit di logica o calcolo spesso utilizzato con parametri diversi. In questo caso, il parametro è la directory di lavoro corrente.
Eccone uno semplice:
function cs () { cd $1 ls }
Come osserva correttamente @geirha , la suddetta funzione fallirà se provi a passare a una directory con uno spazio nel suo nome:
$ cs A\ B/
-bash: cd: A: No such file or directory
<current directory listing>
Dovresti invece usare la seguente funzione:
function cs () {
cd "$@" && ls
}
Una volta aggiunto quel codice al tuo ~/.bashrc, dovresti essere in grado di farlo:
hello@world:~$ cs Documents/
example.pdf tunafish.odt
hello@world:~/Documents$
Puoi usare il builtincomando in bash:
function cd() {
new_directory="$*";
if [ $# -eq 0 ]; then
new_directory=${HOME};
fi;
builtin cd "${new_directory}" && ls
}
function ls() { /usr/bin/ls $* }
cdperché rvmcambia anche la mia cddefinizione. Vedere stackoverflow.com/a/19941991/1601989
Utilizzare una funzione anziché un alias:
cs() { cd "$1" && ls; }
Grazie Florian Diesch per la punta dell'uso di una funzione. Non posso usare cscome nome perché c'è un cscomando nel pacchetto csound , quindi l'ho usato lc.
Ho aggiunto questo a ~/.bash_aliases( nano ~/.bash_aliases):
function lc () {
cd $1;
ls
}
Il terminale deve essere resetperché questo abbia effetto.
$1mancata citazione in questo modo farà fallire se la directory contiene spazi bianchi. Inoltre, è necessario verificare il valore restituito di cd; se fallisce (es. permesso negato), non ha senso eseguire ls. lc() { cd "$@" && ls; }
Come espansione a questa funzione: cs() { cd "$1" && ls; }, si consiglia di passare tutti gli argomenti della funzione per cdutilizzando $@, invece di "$1"come tale: cs() { cd $@ && ls; }.
Ho avuto problemi a ridefinire cdperché rvmcambia anche la mia cddefinizione. Vedi https://stackoverflow.com/a/19941991/1601989 . Non volevo davvero usarlo builtinperché questo saltava qualunque cosa stesse rvmfacendo.
Ho aggiunto quanto segue al mio .bashrc:
# cdd allows you to cd to the directory of the given file or directory
function cdd()
{
if [[ $# -eq 0 ]]; then
cd
elif [[ -d "$*" ]]; then
cd "$*"
elif [[ -f "$*" ]]; then
echo "WARNING: file given, cd to file's dirname" 1>&2
local dir=$(dirname "$*")
cd "$dir"
else
cd "$*"
fi
}
function cs()
{
cdd $* && ls
}
E poi dopo la rmvriga in .bashrc:
alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd