¿Puedo modificar un comando de terminal para hacer cosas adicionales?

8

He buscado alias, funciones ... pero no he encontrado nada satisfactorio. Déjame darte un par de escenarios:

  • El 95% de las veces que entro cden una carpeta, sigo con un ls comando.
  • 90% de las veces que yo mkdir, yo cdmismo en eso.

Tienes la idea.

¿Cuál sería la forma "más limpia" de unir esos comandos (u otra funcionalidad)?

Carles Alcolea
fuente
55
¿Por qué los alias no funcionaron para ti?
Thorbjørn Ravn Andersen
2
Entonces, ¿debería el resultado de CD de mkdir luego agregar el ls?
bmike
@bmike Bueno, un directorio recién creado estará vacío, por lo que ls no imprime nada.
Random832
@ Random832 usted supone que no hay banderas en ls, pero lo más importante es que mi pregunta revelará cómo se desea un cambio roto / pesado. Prefiero los alias sobre las funciones, pero ambos pueden intentar lo que se pide.
bmike
1
@ fd0 No dudo que los alias no funcionaron. Estoy preguntando por qué. Puede haber una solución más simple al problema.
Thorbjørn Ravn Andersen

Respuestas:

4

Puedes poner estas líneas en tu .zsrhco.bashrc

[ -z "$PS1" ] && return
function cd {
builtin cd "$@" && ls -F
}

Resultado ->

ingrese la descripción de la imagen aquí

Explicación de esta respuesta :

Anteriormente en mi .bashrc tengo: [-z "$ PS1"] && return, y todo después de esa línea solo se aplica a sesiones interactivas, por lo que esto no afecta el comportamiento de cd en los scripts.

Más información de este comentario :

[-z "$ PS1"] comprueba si $ PS (variable de solicitud interactiva) tiene "longitud cero" (-z). Si es de longitud cero, esto significa que no se ha configurado, por lo que Bash no debe ejecutarse en modo interactivo. La parte de devolución && sale de la fuente .bashrc en este punto, bajo estas condiciones.

Por cierto, gracias por la pregunta, es realmente genial :)

Editar:

Otra solución sería integrar su ls a su solicitud; Estoy seguro de que puedes hacer eso con OhMyZsh;)

StrawHara
fuente
1
En general, no use el mismo nombre que los comandos estándar como cd ls rm, etc., ya que necesitará usar estos comandos estándar
user151019
@ Mark Estoy de acuerdo con 'rm -rf ~ / *' ^^ Pero para un comando de CD, no es realmente peligroso. Y Carles quiere 'actualizar los comandos existentes', así que ...
StrawHara
Tengo que decir que he usado esta solución desde que @StrawHara la publicó y he tenido 0 problemas. Quería proporcionar el "cómo fue" :) Y es realmente útil; así es como lo uso (.zshrc): i.imgur.com/WHpROIE.png
Carles Alcolea
13

Tendería a hacer un nuevo comando para esto. Creo que incluso sería lógico combinarlos en uno solo.

go() {
    if [ -d "$1" ]; then
        cd "$1" && ls
    else
        mkdir -p "$1" && echo "Created directory $1" && cd "$1"
    fi
}
Aleatorio832
fuente
¡Me gusta tu idea combinando estos! :-)
Martin Allert
55
Esta respuesta es también el más limpio, ya que no hace definición por defecto de molestar cd / mkdir cuando para que los guiones
holroy
1
Claro, pero ¿qué pasa si decides comenzar a usar el lenguaje de programación Go? : P
arxanas
@arxanas: ¿Usas makefiles? ;-)
DevSolar
2
hmmm me gusta este pero si accidentalmente escribe mal el nombre, crea un nuevo directorio. ¿Es difícil poner en práctica un cheque en una licencia (CD /.... o ../o algo así) y eliminar el directorio si está vacío? Quiero decir, si dejas un directorio, solo verifica si está vacío y, de ser así, bórralo. si no quieres eso, todavía puedes usar cd en lugar de ir
Schwertspize
6

He intentado agregar cosas como estas a mi .bashrc:

cd() {
    command cd "$@"
    command ls
}

mkdir() {
    command mkdir "$@"
    command cd "$@"
}

Sin embargo, descubrí que esto puede estropear los scripts que utilizan los comandos anulados, y el manejo de la opción puede ser frágil (por ejemplo, si desea pasar -pal mkdircomando anterior , también se pasa a cd). Mejor sería solo definir alias con diferentes nombres (digamos, co mcd).

arxanas
fuente
1
insertar [ -z "$PS1" ] && returnal final del archivo, antes de esas funciones, debería ayudar
Carles Alcolea
5

Creo que las funciones son el camino a seguir. Algo como

chglist() {
    cd "$1" && ls
}

como ejemplo.

fd0
fuente