¿Las mejores prácticas y consejos de la línea de comandos de Linux?

112

Me gustaría abrir una discusión que acumule las mejores prácticas y consejos de la línea de comandos de Linux (CLI).

He buscado una discusión para compartir el comentario a continuación, pero no he encontrado una, de ahí esta publicación.

Espero que todos podamos aprender de esto.

Le invitamos a compartir sus consejos de Bash, grep, sed, AWK, / proc y todas las demás prácticas relacionadas con la administración del sistema Linux / Unix, las mejores prácticas de programación de shell para el beneficio de todos nosotros.

Maxim Veksler
fuente
¿Por qué solo Linux? Muchos consejos pueden ser útiles en casi todos los sabores de Unix.
Mouviciel
Esta pregunta podría ser un poco más amplia - no es suficiente para las mejores prácticas de la línea de comandos de Linux / Unix para llenar libros enteros ...
Jonik
Estoy de acuerdo en que los consejos de Unix que se pueden aplicar a Linux también son muy bienvenidos, he escrito Linux porque A. Esto es con lo que trabajamos aquí. B. porque está ganando una exposición pública más amplia que la de Unix en los últimos años.
Maxim Veksler
Creo que es una gran idea completar una lista de los comandos más útiles e interesantes que utilizan las personas.
¿Alguno de estos es relevante? refspecs.freestandards.org

Respuestas:

111

Use screen , un multiplexor de terminal gratuito desarrollado por el Proyecto GNU que le permitirá tener varios terminales en uno.

Puede iniciar una sesión y sus terminales se guardarán incluso cuando se pierda su conexión, por lo que puede reanudarla más tarde o desde su hogar.

jeneriz
fuente
2
Los interruptores más comunes que uso son 'screen -D -R' para separar y reanudar mi última sesión de pantalla y 'screen -x' para ver la misma sesión de pantalla desde múltiples inicios de sesión. Además, obtén un buen .screenrc de dotfiles.org/.screenrc
Nick Devereaux el
44
Otra cosa interesante de la pantalla es que puedes compartir un terminal con otras personas cuando quieras colaborar en algo, usando screen -x
gareth_bowles
101

SSH!
SSH es el comando de Dios: creo que es el comando global más valioso para aprender. Las opciones pueden ser bastante desalentadoras, pero parece que estoy aprendiendo constantemente a usar nuevas opciones de línea de comandos para SSH que nunca pensé que serían necesarias. Puede que los haya usado todos en este punto.

Cuanto más lo usas, más aprendes al respecto. Puedes usarlo para hacer algunas cosas INCREÍBLES.

Nota: TODAS estas cosas se pueden hacer de forma remota sin configuración en su servidor, excepto para tener el servidor ssh ejecutándose.

Montar un sistema de archivos a través de internet

buscar en la red SSHFS

Reenviar comandos .

¡El protocolo SVN + SSH es Subversion de un cliente remoto a un servidor sin ejecutar ningún DEAMON! El comando SVN inicia el servidor a través del shell ssh y pasa la información de un lado a otro a través de la tubería existente. El programa rsync hace lo mismo, se ejecuta contra un servidor sin demonio rsync al iniciar uno a través de SSH. Es fácil escribir sus propios archivos bash para hacer trucos similares.

Cadena para atravesar firewalls

Lo uso todo el tiempo para saltar a través de mi servidor Linux en casa a mi Mac.

Puertos de reenvío:
parece moderadamente útil hasta que se da cuenta de que puede rebotar a través del firewall de su hogar y configurar su enrutador en el hogar desde el trabajo como si lo estuviera haciendo desde su red doméstica).

Reenviar X solicitudes:

Este es otro asombroso. Con o sin un servidor X ejecutándose en su sistema remoto, puede ejecutar un programa x-windows y la ventana aparecerá en su pantalla local. Solo usa el interruptor -X, ¡eso es todo!

Como no tiene que tener un servidor X ejecutándose en su servidor remoto, el impacto de la CPU en su servidor es mínimo, puede tener un servidor TINY Linux que sirva enormes aplicaciones para su poderosa PC de juego con Windows y cygwin / X.

Por supuesto, VI y EMACS funcionan sobre SSH, pero cuando estoy corriendo en casa, a veces quiero más. ¡Uso ssh -X para iniciar una copia de Eclipse! Si su servidor es más potente que su computadora portátil, tiene la GUI justo allí en su computadora portátil, pero las compilaciones se realizan en su servidor, así que no se preocupe por la carga del sistema.

Ejecutar en archivos por lotes

(lo que significa ejecutar un archivo por lotes local que "hace cosas" en otros sistemas):

Dos cosas se combinan para hacer que este sea genial. Una es que puede eliminar las solicitudes de contraseña mediante el uso de claves de cifrado (más seguras). El segundo es que puede especificar un comando en la CLI de SSH. Lo he usado de algunas maneras interesantes: como cuando falla una compilación en el servidor remoto, lo tendría en SSH en mi computadora y reproduzco un archivo de sonido).

Recuerde que puede redirigir la salida desde el comando remoto y usarla dentro de su archivo por lotes local, por lo que también podría estar localmente siguiendo una compilación que se ejecuta en su servidor.

Construido en Mac

Tanto el servidor como el cliente están integrados en mac y linux. En el caso de Mac y Ubuntu, habilitar un servidor es tan simple como encontrar la casilla de verificación correcta.

En una PC, instale cygwin o cygwin / X (cygwin / X le permitirá reenviar su salida de x-window desde su máquina Linux a su PC con Windows; instala un servidor X)

Consejos importantes / archivo de configuración

Nunca use el puerto 22 en su firewall. Obtendrá muchos intentos de pirateo, simplemente no vale la pena. Simplemente haga que su firewall reenvíe un puerto diferente a su servidor.

Existen amplias opciones de configuración que le permiten simplificar significativamente sus comandos ssh. Aquí hay un ejemplo mío en el trabajo:

Host home
    hostname billshome.hopto.org
    Port=12345
    user=bill
    LocalForward=localhost:1025 mac:22

Cuando escribo "ssh home" (nada más), actúa como si hubiera escrito:

ssh -p 12345 bill@billshome.hopto.org

y luego reenvía mi puerto local 1025 a mi sistema "mac" en casa. La razón de esto es que tengo otra entrada en mi archivo:

Host mac
    hostname localhost
    port=1025

así que una vez que he hecho un "ssh home" y todavía tengo la ventana abierta, puedo escribir "ssh mac" y la computadora en el trabajo aquí intentará conectarse a su propio puerto 1025 que ha sido enviado a "mac: 22 "por el otro comando, por lo que se conectará a mi Mac en casa a través del firewall.

Editar - guión genial!

Desenterré un guión antiguo que me encanta, tuve que volver y publicarlo para cualquiera que pudiera estar interesado. El guión se llama "authMe"

#!/bin/bash
if [ ! -f ~/.ssh/id_dsa.pub ]
then
    echo 'id_dsa.pub does not exist, creating'
    ssh-keygen -tdsa
fi
ssh $1 'cat >>.ssh/authorized_keys' <~/.ssh/id_dsa.pub

Si tiene este script en su directorio de inicio y hay un host al que puede conectarse (a través de ssh), puede escribir "./authMe hostName".

Si es necesario, creará un par de claves público / privado para usted, luego se enviará a la otra máquina y copiará su clave pública (el comando ssh le pedirá una contraseña ...)

Después de esto, el comando SSH ya no debe solicitar su contraseña cuando se conecta a ese sistema remoto, utilizará el par de claves público / privado.

Si su computadora remota no siempre es segura, debería considerar establecer una "frase de contraseña" cuando se le solicite.

También es posible que desee configurar el servidor ssh en el otro extremo para no permitir contraseñas de texto (solo claves) para mayor seguridad.

Bill K
fuente
44
+1 publicación muy bonita y compacta
Karsten
2
Una pequeña nota sobre SSH sobre el puerto 22: siempre que tenga una buena contraseña de root y sus usuarios no tengan contraseñas terribles, solo ejecutar fail2ban (o algo similar) es suficiente para evitar intentos de crack. Me pareció realmente molesto mantener SSH en otro puerto.
David Wolever
1
A veces puede ser irritante, pero el volumen de las conexiones fue aterrador. Sé que se supone que no deben pasar, pero es como si tuvieras a alguien caminando hacia tu casa y tocando el pomo de la puerta cada minuto, solo desconcertante.
Hay una versión incorporada de su último comando en la mayoría de las versiones de ssh hoy en día, se llama ssh-copy-idy es tan simple comossh-copy-id user@someserver
JamesHannah el
Otra forma de hacer su truco 'ssh mac' es usar una directiva ProxyCommand en su archivo .ssh / config. Host mac ProxyCommand ssh -q home "nc% h% p" Esto ejecutará netcat (nc) en el hogar y redirigirá su conexión ssh directamente a mac. Me parece más fácil a los que la cadena (por ejemplo, si necesita conectarse a 'casa' para llegar al 'trabajo bastión' para llegar a 'servidor web trabajo'.
toppledwagon
73

Me gusta usar

cd -

para cambiar al directorio anterior. ¡Muy útil!

Fortyrunner
fuente
66
¡Nunca supe esto! ¡Gracias! En una nota relacionada, pushd y popd hacen algo similar al construir una pila de directorios. Este tipo de trucos ayudan cuando estás navegando por una estructura de directorio profunda.
Esto es pura iluminación.
Manuel Ferreria
69

Recientemente descubrí el pvcomando (visor de tuberías) que es como cat pero con detalles de transferencia.

Entonces en lugar de

$ gzip -c access.log > access.log.gz

Puedes usar

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

Entonces, en lugar de no tener idea de cuándo terminará su operación, ¡ahora lo sabrá!

Cortesía de Peteris Krumins.

Nick Devereaux
fuente
$ gzip -c access.log> access.log.gz Por qué no solo: $ gzip access.log
Oh, eso funciona :) Acabo de tomar el ejemplo del sitio web de Peteris.
Nick Devereaux el
Eso se ve bien viejo tee(1).
Daniel C. Sobral
Utilidad extremadamente útil, una que siempre olvido :-(
Patrick
53
sudo !!

Vuelva a ejecutar el comando anterior como root.

[El comando superior actual en el sitio http://www.commandlinefu.com , un sitio con el tema de esta pregunta.]

codeinthehole
fuente
2
Divulgación -
Ejecuto
99
Le habría salvado a este chico 16 personajes: xkcd.com/149
46

Presione Ctrl-R y comience a escribir un comando (o cualquier parte de él): busca en el historial de comandos. Al presionar Ctrl-R nuevamente, saltará a la siguiente coincidencia, enter ejecuta el comando que se muestra actualmente y la flecha derecha (al menos) le permitirá editarlo primero.

$ (reverse-i-search)`svn': svn status

Había usado Linux durante unos 7 años como mi sistema operativo principal antes de enterarme de esto, pero ahora que lo sé, es bastante útil.

Jonik
fuente
Gracias. He estado usando la búsqueda inversa, pero no he podido encontrar la manera de saltar a la siguiente coincidencia.
Adam
Ctrl-S salta al siguiente partido. Puede que tenga que hacer stty -ixonprimero para desactivar el significado de control de flujo XON / XOFF (esto también hace que Ctrl-Q esté disponible, de forma predeterminada se asigna para que sea lo mismo que Ctrl-V entre comillas, pero puede cambiarlo a otra cosa ) Ver man sttyy man readlinepara más información. El sttycomando se puede agregar a su~/.bashrc
Dennis Williamson
45

La línea de comando es algo gracioso. Creo que solo puedes aprender mucho por tu cuenta y el resto lo aprendes por accidente mirando a alguien más usando una línea de comando.

Estuve usando el shell durante años escribiendo minuciosamente los nombres de directorio a mano. Un día estaba viendo a un amigo perder el tiempo en un sistema y él seguía presionando la tecla de tabulación. Le pregunté "¿por qué estás presionando la pestaña?" Respuesta: intenta completar el directorio o nombre de archivo. ¿Quién lo hubiera adivinado? Escriba un poco del archivo o directorio, presione la pestaña e intentará terminar lo que escribió (el comportamiento depende de qué shell).

Un día, dicho amigo me estaba mirando en la línea de comando y me vio escribir algo como:

coryking@cory ~/trunk/mozi $ pushd /etc
/etc ~/trunk/mozi
coryking@cory /etc $ popd
~/trunk/mozi
coryking@cory ~/trunk/mozi $

¿Quién lo hubiera adivinado? Nunca supo sobre popd/ pushd. Supongo que somos incluso ...

Cory R. King
fuente
1
Para mí, la finalización de la pestaña parece algo "obvio", muy básico, pero tampoco sabía nada sobre popd / pushd. Gracioso de hecho. :)
Jonik
3
También vea esta respuesta para poder completar con pestañas mucho más que comandos, archivos y directorios: stackoverflow.com/questions/603696//603919#603919
Jonik
1
Eso es muy cierto. Aprendí sobre la búsqueda de la historia hacia atrás de bash (ctrl-r) mirando a alguien. Más tarde me di cuenta de que era una característica de readline y funcionaba igual en otros programas que incorporan readline (mysql, gdb, python -i, clisp, etc.).
sigjuice
2
¿Cómo podría usar "el shell" durante años y no saber acerca de la finalización de la pestaña?
prestomation
Cuando se trata de pushd / popd no se olvide de mencionar el comando directorios . Muestra lo que hay en la pila pushd / popd.
slm
41

Aprende Vim.

Es (posiblemente) el mejor editor, pero sin duda el mejor editor disponible en un servidor Linux desnudo.

Ali A
fuente
1
gvim también es el mejor navegador de archivos en Windows;)
Esto también es extremadamente útil ya que una vez que conoces vim, puedes poner la mayoría de los shells en modo vi, y la navegación se vuelve extremadamente fácil y rápida
Patrick
38

A veces es útil dejar un programa en ejecución incluso después de haber cerrado sesión. He visto algunas soluciones que usan nohup o incluso pantalla para ese propósito. Lo más simple que sé es:

$ your_command_here & disown

También puede separar un programa en ejecución:

$ your_command_here
# Press <Control-Z> to stop the program and bring it to background:
$ bg
$ disown
kyku
fuente
66
Usar la pantalla es genial porque puedes "reconectarte" a esa aplicación desde cualquier lugar más tarde.
Prestomation
+1, no había oído hablar de disown.
user18911
Lo mismo ocurre, aunque ya hago lo mismo con la pantalla
Andy
38

Cuando quiero asegurarme de que uso el comando real y no un alias, uso una barra diagonal inversa inicial:

\rm -rf ~/tmp
Mouviciel
fuente
¿Es esto lo mismo que "comando rm -rf ~ / tmp"?
Maxim Veksler
No sabía "comando", pero se ve igual.
mouviciel 02 de
44
Bueno, sí, a menos que el "comando" no sea un alias, en cuyo caso tendrías que usar \ command rm -rf ~ / tmp en ese caso \ rm -rf ~ / tmp es mejor
Jamol
@presario y crees que sería posible crear un alias para "/"? Qué pena no puedo votar los comentarios :)
Vea también el comando similar " builtin".
Dennis Williamson
38

Este consejo hará que su CLI sea más cómoda (al menos para mí):

cree un archivo ~ / .inputrc con los siguientes contenidos:

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

Vuelva a cargar bash (por ejemplo, escribiendo "exec bash"). Cuando escriba el prefijo de un comando y presione la flecha hacia arriba, buscará los comandos que comienzan con su prefijo, por ejemplo, si escribió ssh, mostrará sus conexiones anteriores con shells remotos. Si su mensaje está vacío, la flecha hacia arriba examinará el historial de la manera normal.

kyku
fuente
3
Por lo general, los asocio a \ e [5 ~ y \ e [6 ~ (también conocido como pageup y pagedown) en lugar de volver a unir las flechas, pero es más conveniente que Ctrl-R / Ctrl-S :)
ephemient
+1. Tengo estos vinculados a F8 y Shift-F8 para imitar cmd.exe, pero se aplica el mismo principio.
user18911
44
+1 paraexec bash
Dennis Williamson
También es educativo leer man readliney memorizar sus accesos directos predeterminados
SaveTheRbtz el
También puede hacer bind -f ~/.inputrcpara recargar la entrada sin tener que iniciar un nuevo bash y borrar su entorno actual.
Patrick
36

Use en &&lugar de ;cuando ejecuta múltiples comandos a la vez. Se detiene cuando se produce un error y no ejecuta los otros comandos.

Ejemplo clásico:

./configure && make && make install
x-way
fuente
1
¡Esta práctica está tan subestimada! Debería ser una práctica estándar terminar cada línea de un script de shell con && y usar "true" como comando final.
user18911
3
Lo curioso es que no sabía sobre el ';' comando antes: SIEMPRE había usado '&&'.
Nick Klauer el
44
Puede iniciar los scripts de shell con "#! / Bin / sh -e". Esto se detiene si alguna línea falla.
stribika
3
Puede usar una doble tubería para la cláusula "else":dosomething && echo "success" || echo "teh fail"
Dennis Williamson
2
Hubo una nota reciente en Planet Debian de que es una mala práctica usar -e en la línea shebang. En su lugar, use set -e en el cuerpo del script. De esta manera, el script no funciona de manera diferente si alguien se ejecuta usando sh $ filename.
ptman el
32

Al escribir bucles en la línea de comandos en bash, a menudo prefijo comandos riesgosos con el comando 'echo'.

for item in items; do echo something-risky; done

De esta manera puedo ver el 'algo arriesgado' en su totalidad antes de comprometerme a ejecutarlo. Ayuda cuando su comando arriesgado incluye expansiones variables y globos. Y 'set -x' es muy útil al escribir scripts de bash.

'set -x' habilita la depuración. Consulte http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html para obtener información sobre la depuración de bash.

Jonathon Watney
fuente
3
Yo también hago esto, ¡un truco muy útil!
user18911
1
+1 ¡Esto puede ser un salvavidas! o protector de datos ...
David Oneill
31

Requisito

Debe probar el ancho de banda máximo entre 2 servidores.


Solución

En SERVER1 haz:

nc -u -l 54321 > /dev/null

En SERVER2 haz:

dd if=/dev/zero bs=1MB | nc -u SERVER1 54321 &
pid=$(pidof dd)
while (( 1 )); do kill -USR1 $pid; sleep 2; done

Verá resultados como:

182682000000 bytes (183 GB) copied, 1555.74 seconds, 117 MB/s
182920+0 records in
182919+0 records out

117 MB / s es el factor interesante aquí, que muestra el ancho de banda de transferencia de red real.

Explicacion :

Como el paquete comenzará a fluir a través de la red, podrá ver estadísticas de ancho de banda en SERVER2, que es una muy buena estimación del ancho de banda máximo real posible entre los 2 servidores.

Copia por UDP (para evitar la sobrecarga de TCP).

Copiando desde la memoria (/ dev / zero) en el SERVIDOR1 a la memoria (/ dev / null) en el SERVIDOR2, evitando así que la E / S del disco se convierta en el cuello de botella.

Maxim Veksler
fuente
44
Sin embargo, asegúrese de que ssh no esté configurado para usar la compresión en .ssh / config. De lo contrario, obtendrá números muy agradables que están muy lejos de la verdad ;-)
Joachim Sauer
Jaja sí. Y SSH va a golpear el cifrado y descifrado de su CPU, lo que también arrojará los números.
use netcat en su lugar
bendin 03 de
+1 para netcat. la sobrecarga de SSH se sesgar los números
Mikeage
Refactorizado para modificar las sugerencias de @saua, @Daniel Von Fange y @bendin. Gracias por sus sugerencias chicos.
Maxim Veksler
23

Ver las estructuras del directorio de colores es más fácil.

alias ls="ls --color=tty"

Editar

alias ls="ls --color=auto"
Suroot
fuente
55
Prefiero --color = auto porque no envía caracteres de control de basura si se redirige al archivo, también puede hacer alias grep = "grep --color = auto" para resaltar los patrones coincidentes.
+1 para --color = auto; ¿Podría alguien aumentar la respuesta con eso?
Jonik
Creo que tty hace lo mismo que auto aquí.
joshudson
Actualizado para reflejar el color = auto
Suroot
Curiosamente, el color hace que las cosas sean mucho menos legibles para mí. El amarillo sobre blanco, por ejemplo, no es una buena opción para colorear.
20

Algunos pequeños consejos sobre la visualización de registros:

  1. Puede usar tail -F para seguir viendo el registro después de que se trunca (por ejemplo, log4j).
  2. Puede usar menos: abrir menos, hacer clic MAYÚS + F para emular el comportamiento de la cola. La combinación también útil es -S para deshabilitar el ajuste de línea. less le permitirá buscar en los registros.
Maxim Veksler
fuente
1
¡Y con tail -fusted puede ver múltiples registros a la vez! Por ejemplo:tail -f log1.txt -f log2.txt
Stu Thompson
@StuThompson: Gracias. No sabía eso. Además, es posible que desee pagar vanheusden.com/multitail
Maxim Veksler
20

Aprendí un truco de un amigo hace mucho tiempo para cambiar fácilmente la extensión de un archivo:

mv my_filename.{old,new}

La expansión de Shell expandirá esto a:

mv my_filename.old my_filename.new

Esto también se puede usar para cambiar el nombre de un archivo de otras maneras, como agregar algo en:

mv my_{,cool_}filename
Scotty Allen
fuente
66
¡Solo asegúrese de no poner comodines u otras expresiones de patrón en el mismo comando, o el globo podría expandirse a más de 2 argumentos! mv *. {old, new} es probable que produzca resultados realmente sorprendentes.
Sí, de acuerdo - esta es una advertencia importante :)
2
También puede escribir, por ejemplo, ls -l /bin/cluego presionar Alt-Shift- {y completará esto ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}para usted.
Dennis Williamson
19

Use "tar xf" para extraer archivos comprimidos. La j para bzip2 y la z para gzip no son necesarias, ya que tar detectará el tipo de archivo de su archivo. Tampoco es el signo '-' antes de los argumentos. Ahorrará mucho tiempo (más de un milenio ;-)).

Mejor aún, use unfoo para extraer cualquier archivo con un solo comando sin argumentos innecesarios.

kyku
fuente
Sí, lo tengo alias ut="tar xf", hace que extraer archivos sea aún más fácil.
David Wolever
Esto falla en algunas distribuciones RHEL, si las usa.
pvsnp
El nuevo alquitrán también tiene un interruptor "J" para comprimir archivos xz (basados ​​en 7zip)
Hubert Kario
O instale unp: packages.debian.org/sid/unp . Supongo que es similar a unfoo.
Zitrax
17

Instale el paquete bash-complete. Contiene una serie de reglas de finalización predefinidas para shell. Habilítelo escribiendo "source / etc / bash_completion" si la distribución no lo hace por usted. Luego, por ejemplo, cada vez que complete después de kpdf, solo verá una lista de directorios y archivos PDF. Es tan inteligente como completar archivos remotos después de scp ssh: // server / XXX (si habilitó inicios de sesión sin contraseña).

kyku
fuente
17

Uso constantemente estos

ALT-. (ESC +. En algunos terminales) copia el último argumento utilizado (súper útil)

CTRL-W elimina palabra

Terminal CTRL-L clear (como el comando clear pero más rápido)

ALT-B (ESC + B en algunas terminales) retrocede una palabra

ALT-F (ESC + F en algunas terminales) avanza una palabra

CTRL-E salta a EOL

CTRL-A salto a BOL

Búsqueda CTRL-R en el historial

Álvaro
fuente
1
¡Gracias por compartir los atajos! No conseguí que ALT-B / F funcionara en Mac.
Léo Léopold Hertz 준영
Awesome man ....
Daud Ahmad Khokhar
16

En bash, uso ! $ Mucho. Repite el último argumento del último comando:

ls /really/long/command/argument/that/you/dont/want/to/repeat.txt
vi !$

Ejecutará el ls, luego, si desea editarlo, no tiene que volver a escribirlo, solo use! $. Esto es realmente útil para nombres largos de ruta / archivo. Además ,! * Repite todos los argumentos del comando anterior. No lo uso tanto, pero parece útil.

Sabía que habían sido mencionados, pero uso mucho vim, screen y cd.

Olvidé noclobber:

set -o noclobber

De man bash :

Si se establece, bash no sobrescribe un archivo existente con los operadores de redirección>,> & y <>. Esto puede anularse al crear archivos de salida utilizando el operador de redirección> | en lugar de>.

gpojd
fuente
66
No uso $ !, ya que es muy fácil engordar, pero me gusta golpear ^ [-. (período de escape) para obtener el mismo efecto.
David Wolever
77
Dependiendo de su teclado, etc., también puede hacerlo Alt-..
Dennis Williamson
Omg, pequeño orgasmo, ty Dennis!
artifex
14

Cambie de bash a zsh y vea cómo mejora su productividad:

  • Realización de pestañas programable realmente inteligente. Completa no solo las líneas de comando, sino todas las opciones, nombres de páginas de manual, nombres de paquetes (para apt-get / emerge, etc.) y lo que tiene. Y proporciona una explicación útil de las opciones durante la finalización. Todo esto sin usar ningún espacio de desplazamiento hacia atrás después de que se haya emitido el comando.
  • Completar tabulación de comodines; escriba cat * .txt, presione tabulador y elija entre cualquier archivo que coincida con la expresión.
  • Cambie los directorios simplemente escribiendo sus nombres.
  • Varios modos de editor de línea. Puede comportarse como vi o emacs si así lo desea.
  • Teclas personalizables para hacer lo que desee.
  • Indicaciones impermeables, incluida la capacidad de colocar información de solicitud en el lado derecho de la pantalla y hacer que se oculte automáticamente al escribir un comando largo

Google te dirá muchos más beneficios.

flodin
fuente
1
deberías dar más de un enlace. Suena interesante, ¡pero véndemelo, hombre!
¿Se las arreglaron para incluir soporte Unicode?
@Cory Muy bien, simplemente no quería plagiar y se sentía redundante para escribir mi propio cuando hay tanto buen material escrito por otros ya :)
@kyku sí, hay soporte Unicode adecuado desde hace un año.
se ve bien. ¡Lo intentaré!
13

Vieja escuela, moviendo un árbol de directorios de un lugar a otro, conservando enlaces simbólicos, permisos y todo lo bueno:

tar cBf - . | (cd /destination; tar xvBpf -)

o a través de la red

tar cBf - . | rsh foo.com "cd /destination; tar xvBpf -)

Nueva escuela:

rsync -urltv . /destination

o a través de la red

rsync -urltv -e ssh . foo.com:/destination
Paul Tomblin
fuente
tar xvBpf - -C /destination== (cd /destination; tar xvBpf -) Un poco menos escribiendo y más fácil de usar sobre ssh.
ephemient
1
-a es lo mismo que '-rlptgoD', es decir, recurse, copiar enlaces simbólicos como enlaces simbólicos, preservar permisos, preservar marcas de tiempo, preservar grupos, preservar propietarios, copiar archivos de dispositivo y archivos especiales como dispositivo y archivos especiales. Además, entre máquinas, -z (comprimir archivos antes de enviar, descomprimir después de recibir) es útil. rsync -avz [-e ssh] es su amigo :-)
dr-jan
¿-Z hace algún bien sobre ssh? No lo creo.
Paul Tomblin el
rsync -avhes mejor en una sola máquina: hgarantiza que los enlaces duros se transfieran correctamente sin convertir cada enlace en un archivo separado, aunque si tiene una gran cantidad de archivos, puede usar mucha memoria. rsync -avzh . foo.com/destinationes el equivalente para la red y, por lo general, no necesita el -e sshque rsync sabrá para usar ssh.
RichVel
En realidad, en estos días estoy usandorsync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
Paul Tomblin
13

Requisito : tiene un directorio que contiene una gran lista de archivos que desea eliminar. rm -r fallará!

ejemplo

find /var/spool/mqueue/ | wc -l
191545
rm -f /var/spool/mqueue/*
-bash: /bin/rm: Argument list too long

Solución :

find /var/spool/mqueue/ -xdev -exec command rm -f '{}' +

Explicacion :

Editar: explicación de la fijación después del comentario @ephemient.

find proporcionará argumentos a rm por los argumentos máximos permitidos. Esto permitirá que rm elimine archivos en lotes, que es la técnica más rápida que conozco sin usar la operación -delete de find. Es equivalente a

find /var/spool/mqueue -xdev -print0 | xargs -0 rm -f

que puede resultarle útil si findno lo admite -exec ... +.

Maxim Veksler
fuente
55
Reemplazar \;con +: luego findhará lo que xargshace de manera predeterminada, que es agrupar los argumentos tanto como sea posible (sin exceder el límite de la lista de argumentos). O simplemente use -deleteintead de -exec rm(GNU Findutils necesarios para ambos)
ephemient
Buen consejo: no conocía el '+'.
codeinthehole
@ephemient: Buen comentario, he editado la publicación.
Maxim Veksler
2
Interesante, no había oído hablar de '+'.
user18911
o simplemente find ... -delete, si tu hallazgo está tan dotado.
David Wolever
11

Utilizo estos dos consejos con tanta frecuencia que pensé que sería una buena idea compartir:

!foo

Lanzará el último comando en el archivo de historial que comienza con "foo" (a menudo lo uso cuando compilo, !gccpor ejemplo).

El otro es un atajo de teclado (Ctrl + O en lugar de Retorno), esto ejecutará el comando Y mostrará el siguiente comando en el archivo de historial. Por ejemplo, cuando compilo y pruebo un archivo siempre hago 3 o 4 comandos, make, cd al directorio de la prueba, ejecuto la prueba, cd al directorio del archivo MAKE. Usar Ctrl + O hace que esta tarea sea mucho más fácil :)

¡Espero que esto ayude!

claferri
fuente
1
+1 para Ctrl-O
Dennis Williamson
10

Cómo usar subversion en Linux sin la ayuda de interfaces gráficas sofisticadas que pueden no estar disponibles.

svn co <repo-url> . # Checks out project into current folder

svn update # Get latest changes from server

svn status # Shows what files have changed locally

svn add <path/filename> # Add some file to the repo

svn commit # Commit your changes to the repo

Esto impide que muchos desarrolladores usen Linux, curiosamente.

postfuturista
fuente
rapidsvn es una pequeña interfaz gráfica de usuario para svn en Linux.
Ciertamente, hay muchas GUI elegantes y potentes disponibles (como la de IntelliJ IDEA), pero me gusta la posibilidad de utilizarlas o la línea de comandos (también potente, pero de manera diferente), lo que mejor se adapte a la situación actual
Jonik
Mi favorito de lejos es NautilusSVN (al igual que TortoiseSVN): code.google.com/p/nautilussvn
user7655
10

Comando de la vieja escuela más ignorado: find

Ayer reparé un error de permisos brutos:

for u in nr dias simonpj; do
   sudo -u $u find . -type d -exec chmod g+s '{}' ';'
done
Norman Ramsey
fuente
¡Si! Aprende el comando de búsqueda. ¡Encontrar mezclado con xargs, sed y awk lo convierte en un gigante de procesamiento de archivos!
Jonathon Watney el
¡Convenido! Aunque nunca recuerdo nada sobre sed y awk, ¡siempre necesito volver a aprenderlo! Realmente debería imprimir una hoja de trucos.
Sí, pero no olvide usar -print0 y la opción -0 para xargs para evitar problemas complicados que involucran nombres de archivos que contienen caracteres inusuales (por ejemplo, barra invertida).
user18911
Sí, probablemente la mitad del tiempo uso encontró que es para arreglar las cosas estúpidas permisos: chmod 644 $(find . -type f),chmod 755 $(find . -type d)
David Wolever
1
No olvide la -permopción de findubicar archivos que tienen permisos establecidos de cierta manera.
Dennis Williamson
8

Para shells como bashy ksh, puede hacer que la línea de comando responda a comandos de navegación como su editor de texto:

set -o emacs

o

set -o vi

le permitirá buscar en su historial y moverse por la línea de comandos de la forma en que está acostumbrado a hacerlo en archivos de texto (por ejemplo, en modo vi, presionando ESCy escribiendo /stringbuscará en sus comandos anteriores "cadena" - puede usar ny Nmover entre partidos)

Tim Whitcomb
fuente
Error tipográfico menor: "editor de prueba" debería ser "editor de texto"
8

grep es mi amigo Seriamente.

Lista de .rbarchivos que contienen el texto class foo:

grep -l "class foo" .rb

Lista de .rbarchivos que no contienen el texto class foo:

grep -L "class foo" *.rb

Enumere los .rbarchivos que no contienen foo o bar (puede usar cualquier expresión regular con -e, pero necesita escapar de los operadores):

grep -L -e "foo\|bar" *.rb
Sarah Mei
fuente
Es posible que le interese una herramienta llamada "ack", que hace lo mismo que grep pero escaneará recursivamente solo los archivos fuente. Pruébalo
8

La sustitución de la carcasa se realiza con ^:

/home/eugene $ ls foo.txt
foo.txt
/home/eugene $ ^ls^rm
rm foo.txt
/home/eugene $ ls foo.txt
ls: cannot access foo.txt: No such file or directory
Eugene Morozov
fuente
2
En realidad, prefiero "!!: gs / foo / bar", ya que a menudo encuentro que foo se menciona más de una vez en el comando anterior y quiero un reemplazo global (por ejemplo, "mv foo.txt foo.bak").
user18911