Trabajo rápido y efectivo en línea de comando

Hay muchos consejos y trucos en la línea de comandos en Internet. La mayoría de ellos describe los triviales como "aprende las teclas de acceso rápido" o " sudo !! ejecutará el comando anterior con sudo". En lugar de eso, ¡te diré qué hacer cuando ya hayas aprendido las teclas de acceso rápido y conozcas sudo !! .


El terminal debe comenzar instantáneamente.


¿Cuánto tiempo pasas para lanzar una terminal? Y otro? Durante mucho tiempo he usado el atajo Ctrl + Alt + T para iniciar un terminal y pensé que era rápido. Cuando migré de Openbox a i3, comencé a lanzar una terminal a través de Win + Enter, ese enlace funcionó de fábrica. Sabes que? Ahora no creo que Ctrl + Alt + T sea lo suficientemente rápido.


Por supuesto, la cosa no es una aceleración de milisegundos, sino que abres una terminal a nivel de reflejos, completamente ajena a eso.


Entonces, si a menudo usa un terminal, pero toma un mouse para iniciarlo, intente configurar una tecla de acceso rápido útil. Estoy seguro de que te gustará.


Zsh en lugar de bash


Este es un tema de guerra santa, lo sé. Debe instalar Zsh para al menos tres características: autocompletado avanzado, corrección de errores tipográficos y compleción de múltiples rutas de acceso: cuando una sola pestaña convierte /u/s/d en /usr/share/doc . Arch Linux ya ha migrado a Zsh en su CD de instalación. Espero que Zsh se convierta una vez en un shell predeterminado en Ubuntu. Ese será un momento histórico.


Comenzar a usar Zsh no es nada difícil. Simplemente instálelo a través del administrador de paquetes y encuentre una bonita configuración. Recomiendo tomar la configuración utilizada en Arch Linux:


 $ wget -O ~/.zshrc https://git.grml.org/f/grml-etc-core/etc/zsh/zshrc 

Lo único que queda es cambiar su shell predeterminado y volver a iniciar sesión.


 $ chsh -s $(which zsh) 

Eso es todo, sigue trabajando como si nada hubiera pasado.


Cómo debería verse el indicador de shell


El indicador de shell es un pequeño fragmento de texto que se muestra en el terminal al comienzo de su línea de comando. Debe configurarse para su tipo de trabajo. Puedes percibirlo como un tablero de instrumentos de un vehículo. ¡Por favor, ponga información útil allí, deje que le ayude a navegar! ¡Hazlo útil especialmente si lo ves todos los días!


El indicador de shell debe ser de color. No estoy de acuerdo Intente contar cuántos comandos se ejecutaron en este terminal:



Y ahora con color:



El indicador de shell debe mostrar un directorio de trabajo actual de un shell. Si no se muestra el directorio de trabajo actual, debe tenerlo en cuenta y verificarlo periódicamente con el comando pwd . Por favor no hagas eso. Tenga en cuenta algunas cosas realmente importantes y no pierda su tiempo para el comando pwd .


Si a veces cambia a la cuenta raíz, necesita una indicación de "usuario actual". El nombre de usuario particular a menudo no es importante, pero su estado (regular o raíz) sí lo es. La solución es usar color: indicador de shell rojo para root y verde para usuario normal. Y nunca se hará cargo de root shell como de costumbre.


Si se conecta a servidores mediante ssh, debe distinguir sus shells locales y remotos. Para ese fin, su indicador de shell debe contener un nombre de host, o incluso mejor, indique una conexión ssh.


El indicador de shell puede mostrar el código de salida del último comando. Recuerde que el código de salida cero significa que un comando salió con éxito, que no es cero: el comando salió sin éxito. Puede obtener el código de salida del último comando a través de echo $? , pero escribir todo eso es algo muy largo. Deje que el shell le muestre una salida fallida.


Si trabaja con repositorios Git, será útil ver el estado del repositorio en el indicador de comandos de la shell: rama actual y el estado del directorio de trabajo. Ahorrará algo de tiempo en el git status git branch y los comandos de git branch y no se comprometerá con una rama incorrecta. Sí, el cálculo del estado puede llevar un tiempo significativo en los depósitos de grasa, pero para mí los pros superan a los contras.


Algunas personas agregan reloj al indicador de comandos de la shell o incluso el nombre de una terminal virtual (tty), o algunos garabatos arbitrarios. Eso es todo superfluo. Es mejor dejar mucho espacio para los comandos.


Así es como se ve mi indicador de shell en diferentes condiciones:



Puede ver en la captura de pantalla que la barra de título del terminal hace el mismo trabajo. También es un tablero de instrumentos y también debe configurarse.


Entonces, ¿cómo se debe implementar todo esto en .zshrc ? La variable PROMPT establece el indicador izquierdo y RPROMPT establece el indicador derecho. La variable EUID define el estado de un usuario (regular o raíz) y la presencia SSH_CLIENT o SSH2_CLIENT indica conexión ssh. Entonces podemos tener una plantilla:


 if [[ -n "$SSH_CLIENT" || -n "$SSH2_CLIENT" ]]; then if [[ $EUID == 0 ]]; then PROMPT=... else PROMPT=... fi else # not SSH if [[ $EUID == 0 ]]; then PROMPT=... else PROMPT=... fi fi 

No muestro el código listo para copiar y pegar, ya que la implementación exacta es cuestión de gustos. Si no quieres molestarte y la captura de pantalla de arriba está bien para ti, entonces toma mi cofig del Github .


Resumen:


  • El indicador de color del shell es imprescindible.
  • El mínimo requerido es un directorio de trabajo actual.
  • La cáscara de la raíz debe ser claramente visible.
  • El nombre de un usuario no le importa una carga útil si usa solo una cuenta.
  • El nombre de host es útil si se conecta a los servidores a través de ssh, no es obligatorio si no lo hace.
  • Es útil ver el código de salida fallido de un último comando.
  • El estado de repositorio de Git ahorra tiempo en el git status git branch y en los comandos de git branch y ofrece una seguridad total.

Utiliza mucho el historial de comandos


La mayor parte de los comandos en tu vida los ingresas más de una vez, por lo que sería genial sacarlos del historial en lugar de volver a escribir. Todos los shells modernos guardan un historial de comandos y proporcionan varias formas de buscar en ese historial.


Quizás ya pueda excavar el historial utilizando la combinación de teclas Ctrl + R. Lamentablemente tiene dos desventajas:


  1. La línea de comando debe estar vacía para comenzar la búsqueda, es decir, en caso de que "uno comience a escribir un comando, recordado acerca de la búsqueda", primero debe limpiar su escritura, luego presione Ctrl + R y repita su entrada. Eso lleva demasiado tiempo.
  2. La búsqueda directa no funciona por defecto ya que Ctrl + S detiene el terminal.

El tipo de búsqueda más rápido y conveniente funciona de esta manera:


  1. Empiezas a escribir un comando,
  2. te acuerdas de la búsqueda,
  3. presiona una tecla de acceso rápido y el shell le ofrece comandos del historial que comenzaron de la misma manera.

Por ejemplo, desea sincronizar un directorio local con uno remoto utilizando Rsync y ya lo hizo dos horas antes. rsync , presiona una tecla de acceso rápido una o dos veces y el comando deseado está listo para ejecutarse. No necesita activar primero el modo de búsqueda, el indicador de shell no cambia a (reverse-i-search)': y nada salta a ninguna parte. Simplemente se desplaza por el historial de la misma manera que presiona las flechas ↑ ↓ para desplazarse por los comandos ingresados ​​anteriormente pero con un filtrado adicional. Eso es genial y ahorra mucho tiempo.


Este tipo de búsqueda no funciona de forma predeterminada en Bash y Zsh, por lo que debe habilitarlo manualmente. Elegí PgUp para buscar hacia adelante y PgDown para buscar hacia atrás. Está lejos de alcanzarlos, pero ya he hecho un hábito. Tal vez más tarde cambie a algo más cercano como Ctrl + P y Ctrl + N.


Para Bash necesita agregar un par de cadenas a /etc/inputrc de ~/.inputrc :


 "\e[5~": history-search-backward "\e[6~": history-search-forward 

Si ha tomado un .zshrc completo extranjero, es muy probable que PgUp y PgDown ya hagan el trabajo. De lo contrario, agregue a ~/.zshrc :


 bindkey "^[[5~" history-beginning-search-backward # pg up bindkey "^[[6~" history-beginning-search-forward # pg down 

Las conchas de peces e Ipython ya tienen esa búsqueda ligada a las flechas ↑ ↓. Creo que muchos usuarios migraron a Fish solo por el comportamiento de las flechas. Por supuesto, es posible vincular las flechas de esta manera tanto en Bash como en Zsh si lo desea. Use esto en /etc/inputrc de ~/.inputrc :


 "\e[A":history-search-backward "\e[B":history-search-forward 

Y esto para en ~/.zshrc :


 autoload -U up-line-or-beginning-search autoload -U down-line-or-beginning-search zle -N up-line-or-beginning-search zle -N down-line-or-beginning-search bindkey "^[[A" up-line-or-beginning-search bindkey "^[[B" down-line-or-beginning-search 

Es curioso que con el tiempo comencé a escribir comandos teniendo en cuenta que luego los sacaré de la historia. Déjame mostrarte algunas técnicas.


Únete a los comandos que siempre se siguen:


 # ip link set eth1 up && dhclient eth1 # mkdir /tmp/t && mount /dev/sdb1 /tmp/t 

Las rutas absolutas en lugar de las relativas le permiten ejecutar un comando desde cualquier directorio:
vim ~/.ssh/config lugar de vim .ssh/config , systemd-nspawn /home/chroot/stretch lugar de systemd-nspawn stretch y así sucesivamente.


El uso de comodines hace que sus comandos sean más universales. Usualmente lo uso junto con chmod y chown .


 # chown root:root /var/www/*.sq && chmod 644 /var/www/*.sq 

Atajos de teclado


Aquí está el mínimo requerido.


Alt +. - sustituye el último argumento del comando anterior. También se puede acceder con !$ .
Ctrl + A, Ctrl + E: salta al principio y al final de la línea respectivamente.
Ctrl + U, Ctrl + Y: cortar y pegar. Es útil cuando escribe un comando complejo y nota que primero debe ejecutar otro. Hmm, ¿dónde guardar la entrada actual? Justo aqui.
Ctrl + W: mata una palabra antes del cursor. Se borra la línea cuando se presiona y se mantiene. Por defecto, la entrada se guarda en el portapapeles (utilizada para Ctrl + Y).
Ctrl + K: corta la parte de la línea después del cursor y la agrega al portapapeles. Ctrl + A Ctrl + K borra rápidamente la línea.
PgUp, PgDown, Ctrl + R: búsqueda de historial.
Ctrl + L borra la terminal.


Capacidad de respuesta del teclado


Quiero mostrarle una pequeña configuración que le permite desplazarse, navegar y borrar más rápido. ¿Qué hacemos cuando queremos borrar algo grande? Presionamos y mantenemos la tecla Retroceso y vemos cómo se ejecuta borrando caracteres. ¿Qué está pasando exactamente? Después de presionar Retroceso, un carácter desaparece, luego pasa un pequeño retraso, luego se activa la repetición automática: el retroceso borra los caracteres uno por uno, como si lo golpeara repetidamente.


Le recomiendo que ajuste el retardo y la frecuencia de repetición automática para la velocidad de sus dedos. La demora es necesaria cuando desea borrar solo un carácter: le da tiempo para soltar una tecla. Un retraso demasiado grande te hace esperar una autorepetición. No es suficiente para que te molestes, pero sí lo suficiente para ralentizar la transferencia de tus pensamientos de la cabeza a la computadora. Cuanto mayor es la frecuencia de repetición automática, más rápido se borra el texto y más difícil es detener este proceso. El objetivo es encontrar un valor óptimo.


Entonces, el comando mágico es:


 $ xset r rate 190 20 

190 - duración del retraso en milisegundos,
20 - frecuencia en repeticiones por segundo.


Recomiendo comenzar desde estos valores y aumentar el retraso poco a poco hasta obtener falsos positivos, luego regresar un poco. Si el retraso es demasiado pequeño, no podrá usar el teclado. Para solucionar esto, se debe reiniciar un servidor X o una computadora completa. Entonces, ten cuidado.


Para guardar los parámetros, debe agregar este comando en algún lugar del inicio automático de X.


Indicación de salida del proceso


A menudo tengo que iniciar algunos procesos de larga duración: una copia de seguridad pesada, transferencia de grandes datos, empaquetado / extracción de archivos, creación de paquetes, etc. Por lo general, comienzo un proceso de este tipo, cambio a otra tarea y miro ocasionalmente si mi proceso de larga duración ha finalizado. A veces me sumerjo demasiado en el trabajo y me olvido de eso. La solución es agregar una notificación de salida del proceso que me saque del trance.


Hay muchas herramientas para ese propósito: notificar-enviar, dzen2, pitido, aplay, pared. Todos ellos son buenos de alguna manera, pero no funcionan con conexión ssh. Es por eso que uso pitido terminal:


 $ long-running-command; echo $'\a' 

La codificación ASCII tiene un carácter 0x7, llamado campana . Se utiliza para hacer sonar el altavoz de la PC. El altavoz para PC no es algo moderno, no todas las computadoras lo tienen y no se escucha en los auriculares. Es por eso que algunas terminales usan una llamada campana visual. Uso urxvt, y realiza una campana visual al levantar la bandera de urgencia. Que es Es algo que se usa cuando una ventana quiere decirte que es urgente.


Puede verificar cómo reacciona su terminal en el carácter de campana en este momento:


 $ sleep 3; echo $'\a' 

Se le dan tres segundos para que cambie a otra ventana, puede ser necesario.


Desafortunadamente, no todas las terminales pueden mostrar una campana visual al levantar la bandera de urgencia. He comprobado los más populares.


Emulador de terminalcampana visual como bandera de urgencia
konsolepuede estar habilitado en preferencias
urxvtsi
xfce4-terminalpuede estar habilitado en preferencias
xtermno
término retro genialno
terminal terminalno
terminal de gnomono

Es demasiado largo para escribir echo $'\a' , así que hice un alias de activación.


Alias


Por defecto, los comandos cp , scp y rm funcionan de forma no recursiva, ¡y eso apesta! ¡Es un legado muy malo! Bueno, se puede solucionar con alias. Pero primero veamos cuando el comportamiento no recursivo puede ser útil.


 $ mkdir foodir $ cp * foodir 

Solo los archivos se copiarán en foodir , pero no los directorios. La misma situación ocurre con rm :


 $ rm * 

eliminará solo archivos y enlaces simbólicos, pero mantendrá los directorios. Pero, ¿con qué frecuencia necesita esta función? Me gusta pensar que cp y rm siempre funcionan de forma recursiva.


Ok, pero ¿qué pasa con la seguridad? ¿Quizás el comportamiento no recursivo protege sus archivos? Hay un caso cuando tiene un enlace simbólico al directorio y desea eliminar ese enlace simbólico, pero mantenga el directorio. Si se agrega una barra oblicua (intencionalmente u ocasionalmente) al nombre del directorio y el modo recursivo se activa a través de -r , ¡el directorio quedará vacío! VACÍO!


 $ ln -s foodir dir_link $ rm -r dir_link/ 

Sin -r arg -r y no eliminará nada. Por lo tanto, la rm recursiva aumenta un poco el riesgo de perder datos.


Encendí el modo recursivo para cp , scp y rm , y también agregué -p para mkdir para crear directorios anidados fácilmente.


 alias cp='cp -r' alias scp='scp -r' alias rm='rm -r' alias mkdir='mkdir -p' 

Durante dos años nunca me arrepentí de estos alias y nunca perdí datos. También hay un inconveniente: es posible copiar / eliminar menos datos de los necesarios y no verlos cuando se trabaja en el sistema sin alias. Entonces, ten cuidado. Sé lo que hago y siempre corro con precaución.


Los más populares son los alias ls y probablemente ya los uses:


 alias ls='ls -F --color=auto' alias la='ls -A' alias ll='ls -lh' alias lla='ll -A' 

Además, un grep de color es mucho más bonito que incoloro:


 alias grep='grep --colour=auto' 

Los alias no funcionan en scripts, ¡no olvides ese hecho! Debe especificar explícitamente todos los argumentos.


Mecanografía táctil


Es obvio, pero te recuerdo: la escritura táctil ayuda a escribir más rápido. Será difícil al principio, pero superarás los límites con el tiempo.


El mejor momento para aprender mecanografía táctil es vacaciones, cuando nadie te molesta. ¡Por favor, no te apresures al aprender! Tu objetivo es memorizar dónde se encuentra cada personaje, no tanto con tu mente, sino con tus dedos. Es mejor escribir lento, pero sin errores en lugar de rápido con errores. Recuerde que los maestros tienen buenos resultados, no con dedos rápidos, pero sin cometer errores.


No te olvides de tomar un descanso. Tu cerebro y tus dedos necesitan descansar. Cuando los errores comienzan a aparecer, eso significa que debe tomar un descanso.


Eso es todo por hoy


Espero que estos consejos realmente te ayuden. Buena suerte

Source: https://habr.com/ru/post/481940/


All Articles