Respuestas:
De Bash Tips and Tricks: 'cd' con estilo :
Finalmente, quiero mostrarle cómo escribir su propio reemplazo personalizado para el comando 'cd'.
¿Te encuentras siempre escribiendo lo mismo al cambiar a un directorio? Probablemente al menos enumere los archivos allí cada vez, tal vez tanto que sus manos escriban automáticamente 'ls' después de cada 'cd'.
Bueno, al intentar todo lo que se me ocurre, resulta que solo hay una forma de lograr adecuadamente el objetivo que estamos buscando. Tenemos que crear una función de shell.
Las funciones de shell son parte de la programación de shell. Al igual que en los lenguajes de programación compilados, las funciones proporcionan una especie de modularización procesal. Se puede crear una función genérica para realizar un bit de lógica o cálculo de uso frecuente con diferentes parámetros. En este caso, el parámetro es el directorio de trabajo actual.
Aquí hay uno simple:
function cs () { cd $1 ls }
Como @geirha señala correctamente , la función anterior fallará si intenta cambiar a un directorio con un espacio en su nombre:
$ cs A\ B/
-bash: cd: A: No such file or directory
<current directory listing>
En su lugar, debe usar la siguiente función:
function cs () {
cd "$@" && ls
}
Una vez que agregue ese código a su ~/.bashrc, debería poder hacer esto:
hello@world:~$ cs Documents/
example.pdf tunafish.odt
hello@world:~/Documents$
Puedes usar el builtincomando en bash:
function cd() {
new_directory="$*";
if [ $# -eq 0 ]; then
new_directory=${HOME};
fi;
builtin cd "${new_directory}" && ls
}
function ls() { /usr/bin/ls $* }
cdporque también rvmcambia mi cddefinición. Ver stackoverflow.com/a/19941991/1601989
Use una función en lugar de un alias:
cs() { cd "$1" && ls; }
Gracias Florian Diesch por el consejo de usar una función. No puedo usar cscomo nombre porque hay un cscomando en el paquete csound , así que lo usé lc.
Agregué esto a ~/.bash_aliases( nano ~/.bash_aliases):
function lc () {
cd $1;
ls
}
El terminal debe ser resetpara que esto surta efecto.
$1cita así hará que falle si el directorio contiene espacios en blanco. Además, debe verificar el valor de retorno de cd; si falla (por ejemplo, permiso denegado), no tiene sentido ejecutar el ls. lc() { cd "$@" && ls; }
Como una expansión para esta función: cs() { cd "$1" && ls; }, es posible que desee pasar todos los argumentos de la función que cdutilizando $@en lugar de "$1"como tal: cs() { cd $@ && ls; }.
Tuve problemas para redefinir cdporque también rvmcambia mi cddefinición. Ver https://stackoverflow.com/a/19941991/1601989 . Realmente no quería usarlo builtinporque eso omitiría lo que sea que rvmesté haciendo.
Agregué lo siguiente a mi .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
}
Y luego, después de la rmvlínea en .bashrc:
alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd