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 builtin
comando in bash:
function cd() {
new_directory="$*";
if [ $# -eq 0 ]; then
new_directory=${HOME};
fi;
builtin cd "${new_directory}" && ls
}
function ls() { /usr/bin/ls $* }
cd
perché rvm
cambia anche la mia cd
definizione. 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 cs
come nome perché c'è un cs
comando 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 reset
perché questo abbia effetto.
$1
mancata 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 cd
utilizzando $@
, invece di "$1"
come tale: cs() { cd $@ && ls; }
.
Ho avuto problemi a ridefinire cd
perché rvm
cambia anche la mia cd
definizione. Vedi https://stackoverflow.com/a/19941991/1601989 . Non volevo davvero usarlo builtin
perché questo saltava qualunque cosa stesse rvm
facendo.
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 rmv
riga in .bashrc
:
alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd