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 builtin
comando en bash:
function cd() {
new_directory="$*";
if [ $# -eq 0 ]; then
new_directory=${HOME};
fi;
builtin cd "${new_directory}" && ls
}
function ls() { /usr/bin/ls $* }
cd
porque también rvm
cambia mi cd
definició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 cs
como nombre porque hay un cs
comando 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 reset
para que esto surta efecto.
$1
cita 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 cd
utilizando $@
en lugar de "$1"
como tal: cs() { cd $@ && ls; }
.
Tuve problemas para redefinir cd
porque también rvm
cambia mi cd
definición. Ver https://stackoverflow.com/a/19941991/1601989 . Realmente no quería usarlo builtin
porque eso omitiría lo que sea que rvm
esté 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 rmv
línea en .bashrc
:
alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd