¿Cómo puedo crear un alias para cd y ls?

32

Frecuentemente ejecuto el lscomando después de ejecutar el cdcomando. ¿Cómo puedo crear un alias (como cs) para esta operación?

dv3500ea
fuente

Respuestas:

35

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$
Isaias
fuente
1
Eso fallará para los directorios que contienen espacios en blanco. Vea el comentario a la respuesta de dv3500ea.
geirha
24

Puedes usar el builtincomando en bash:

function cd() {
    new_directory="$*";
    if [ $# -eq 0 ]; then 
        new_directory=${HOME};
    fi;
    builtin cd "${new_directory}" && ls
}
Uno de uno
fuente
2
Esto es bastante hábil. Tuve una solución similar a @Florian en mi .bashrc durante mucho tiempo, pero esto es mucho más satisfactorio para cuando olvido que mis colegas no tienen mi alias 'cs' en sus computadoras.
Dino
Me gusta esta respuesta la mejor. Por alguna razón, no puede usar alias para sobrescribir el comando, por lo que debe realizar una función como esta respuesta. : D
trusktr
Pero, ¿qué pasa con los comandos no integrados? Por ejemplo, lo anterior no funcionará para sobrescribir el comando ls. ¿Hay alguna palabra clave para usar en lugar de "incorporado"?
trusktr
use la ruta completa para ello, por ejemplo:function ls() { /usr/bin/ls $* }
OneOfOne
Tuve problemas para redefinir cdporque también rvmcambia mi cddefinición. Ver stackoverflow.com/a/19941991/1601989
DavidG
16

Use una función en lugar de un alias:

cs() { cd "$1" && ls; }
Florian Diesch
fuente
55
+1, ya que esta versión se detendrá si falla 'cd'.
htorque
9

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.

dv3500ea
fuente
8
Tener una $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; }
geirha 02 de
1

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; }.


fuente
1

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
DavidG
fuente