Respuestas:
Esto se expande un poco en el !!
truco mencionado en esta respuesta . En realidad, hay un montón de comandos relacionados con el historial que tienden a olvidarse (las personas tienden a apuñalar Up100 veces en lugar de buscar un comando que saben que escribieron).
history
comando mostrará una lista de comandos ejecutados recientemente con un designador de eventos a la izquierda!N
sustituirá el comando asociado con el designador de eventos N
!-N
sustituirá al N
XX comando más reciente; Por ejemplo !-1
, sustituirá el comando más reciente, !-2
el segundo más reciente, etc.!!
es una forma abreviada de !-1
sustituir rápidamente el último comando!string
sustituirá el comando más reciente que comienza con string
!?string?
sustituirá el comando más reciente que contiene string
Los designadores de palabras se pueden agregar a un !
comando de historial para modificar los resultados. Los dos puntos separan el evento y los designadores de palabras, por ejemplo !!:0
. El designador de eventos !!
puede abreviarse solo !
cuando se usa un designador de palabras, por lo que !!:0
es equivalente a !:0
.
!:0
obtendrá el comando que se ejecutó!:1
obtendrá el primer argumento (y !:2
el segundo, etc.)!:2-3
obtendrá el segundo y tercer argumento!:^
Es otra forma de obtener el primer argumento. !:$
obtendrá el último!:*
obtendrá todos los argumentos (pero no el comando)Los modificadores también se pueden agregar a un !
comando de historial, cada uno precedido por dos puntos. Se puede apilar cualquier número (p !:t:r:p
. Ej .).
h
- En línea con el nombre del archivo baset
- Solo el nombre de archivo baser
- En línea con la extensión del nombre de archivoe
- Solo la extensión del nombre del archivos/search/replacement
- Reemplazar la primera aparición de search
conreplacement
gs/search/replacement
- Reemplace todas las ocurrencias de search
conreplacement
!-#
los tampoco. Utilizo !string
para ejecutar el último comando que comienza con una cadena, pero generalmente lo llevo a tabulación primero (zsh) para asegurarme de que estoy ejecutando lo correcto
!N
ejecutará el comando ..." es una descripción demasiado limitada; en realidad, !N
será sustituido por el comando ...; y así sucesivamente para todas las descripciones en la respuesta. ¡Más correcto y abriendo posibilidades mucho más útiles! Por ejemplo, lo mencionado sudo !!
.
bash
; en Emacs, para navegar por el historial de comandos y valores de entrada (para Mx u otros valores leídos) uno usa Meta-R en su lugar (Meta-R también se usa eshell
en Emacs). Así que a menudo los arruino.
bash - inserta el parámetro final de la línea anterior
alt- . la combinación de teclas más útil de la historia, pruébela y vea, por alguna razón, nadie sabe sobre esta.
presiónelo una y otra vez para seleccionar los últimos parámetros anteriores.
genial cuando quieres hacer algo más al argumento / archivo que usaste hace un momento.
alt
- .
irá a la orden anterior y tire el último argumento de la misma. Así que si desea que el último argumento de hace tres comandos, simplemente pulse alt
- .
tres veces.
yank-last-arg
comando readline, por lo que debería funcionar con cualquier programa vinculado a readline, no solo BASH o ZSH.
Mi favorito es
man 7 ascii
Simple y muy útil.
Oct Dec Hex Char Oct Dec Hex Char
────────────────────────────────────────────────────────────────────────
000 0 00 NUL '\0' (null character) 100 64 40 @
001 1 01 SOH (start of heading) 101 65 41 A
002 2 02 STX (start of text) 102 66 42 B
003 3 03 ETX (end of text) 103 67 43 C
004 4 04 EOT (end of transmission) 104 68 44 D
005 5 05 ENQ (enquiry) 105 69 45 E
006 6 06 ACK (acknowledge) 106 70 46 F
007 7 07 BEL '\a' (bell) 107 71 47 G
010 8 08 BS '\b' (backspace) 110 72 48 H
011 9 09 HT '\t' (horizontal tab) 111 73 49 I
012 10 0A LF '\n' (new line) 112 74 4A J
013 11 0B VT '\v' (vertical tab) 113 75 4B K
014 12 0C FF '\f' (form feed) 114 76 4C L
015 13 0D CR '\r' (carriage ret) 115 77 4D M
016 14 0E SO (shift out) 116 78 4E N
017 15 0F SI (shift in) 117 79 4F O
020 16 10 DLE (data link escape) 120 80 50 P
021 17 11 DC1 (device control 1) 121 81 51 Q
022 18 12 DC2 (device control 2) 122 82 52 R
023 19 13 DC3 (device control 3) 123 83 53 S
024 20 14 DC4 (device control 4) 124 84 54 T
025 21 15 NAK (negative ack.) 125 85 55 U
026 22 16 SYN (synchronous idle) 126 86 56 V
027 23 17 ETB (end of trans. blk) 127 87 57 W
030 24 18 CAN (cancel) 130 88 58 X
031 25 19 EM (end of medium) 131 89 59 Y
032 26 1A SUB (substitute) 132 90 5A Z
033 27 1B ESC (escape) 133 91 5B [
034 28 1C FS (file separator) 134 92 5C \ '\\'
035 29 1D GS (group separator) 135 93 5D ]
036 30 1E RS (record separator) 136 94 5E ^
037 31 1F US (unit separator) 137 95 5F _
040 32 20 SPACE 140 96 60 `
041 33 21 ! 141 97 61 a
042 34 22 " 142 98 62 b
043 35 23 # 143 99 63 c
044 36 24 $ 144 100 64 d
045 37 25 % 145 101 65 e
046 38 26 & 146 102 66 f
047 39 27 ' 147 103 67 g
050 40 28 ( 150 104 68 h
051 41 29 ) 151 105 69 i
052 42 2A * 152 106 6A j
053 43 2B + 153 107 6B k
054 44 2C , 154 108 6C l
055 45 2D - 155 109 6D m
056 46 2E . 156 110 6E n
057 47 2F / 157 111 6F o
060 48 30 0 160 112 70 p
061 49 31 1 161 113 71 q
062 50 32 2 162 114 72 r
063 51 33 3 163 115 73 s
064 52 34 4 164 116 74 t
065 53 35 5 165 117 75 u
066 54 36 6 166 118 76 v
067 55 37 7 167 119 77 w
070 56 38 8 170 120 78 x
071 57 39 9 171 121 79 y
072 58 3A : 172 122 7A z
073 59 3B ; 173 123 7B {
074 60 3C < 174 124 7C |
075 61 3D = 175 125 7D }
076 62 3E > 176 126 7E ~
077 63 3F ? 177 127 7F DEL
Echa un vistazo a este sitio web commandlinefu.com .
También puedes echar un vistazo a estos cuatro artículos de Peteris Krumins en su blog.
ascii
programa separado también es útil. Además de imprimir una tabla, le permite consultar uno o más caracteres individuales.
No estoy seguro si esto cuenta como un "truco", pero la gente parece desconocer las teclas de acceso rápido estándar de readline. De uso particular en conchas:
Ctrl+L
corresponde al carácter ascii de FormFeed. Normalmente redibujará la pantalla en aplicaciones de texto con una ventana de pantalla (por ejemplo, vim, less, mc, etc.). Agradable si la pantalla ha sido "contaminada" por algún resultado de otro programa.
Ctrl+W
cortar una palabra hacia atrás, Alt+F
avanzar una palabra, Alt+B
ir una palabra hacia atrás en una línea. Me gusta Ctrl+Y
y Shift+Insert
porque puedes tener dos líneas copiadas. Uno con Ctrl+U
(péguelo con Ctrl+Y
) y al mismo tiempo puede copiar otra palabra (seleccione la línea) pegar con ( Shift+Insert
).
CTRL+ Ren BASH para buscar / activar comandos ejecutados previamente (el contenido de ~ / .bash_history).
Esto a menudo es extremadamente útil. Ejecutar este alias servirá el PWD sobre HTTP (indexado) en el puerto 8000:
alias webserver="python -m SimpleHTTPServer"
Y debido a que corro make todo el tiempo, y spaz y tecleo demasiado rápido, estos alias son probablemente los más utilizados (en serio):
alias maek=make
alias mkae=make
alias meak=make
alias amka=make
alias akme=make
Y probablemente mi pieza más utilizada de BASH es un script simple que llamo upload. Lo uso para borrar cualquier tipo de contenido a mi Linode, y copia la URL HTTP resultante en mi portapapeles (clic central). Muy útil para pegar cosas a personas en IRC:
scp -r $* $user@$host:public_html && {
URL="http://$host/~$user/$(basename $1)"
echo "$URL"
xselection -replace PRIMARY "$URL"
}
Solo un par. Puedo publicar mucho más tarde, ¡debo volver al trabajo!
alias mk=make
Más rápido de escribir y menos probabilidades de equivocarse. O compile desde su editor usando una tecla de
alias m=make
, o incluso m=make -j6
o similar, excepto que ya uso alias m=mutt
☺
Bastante básico, pero la gente no parece saberlo, te devuelve al directorio anterior:
cd -
cd..
desde DOS está arraigada en mi memoria muscular ...
cd
(sin argumento) que lo lleva a su directorio de inicio.
La expansión de llaves es un mecanismo por el cual se pueden generar cadenas arbitrarias.
Le permite reemplazar líneas tediosas como:
mv loong/and/complex/file/name loong/and/complex/file/name.bacukup
con una instancia más corta
mv loong/and/complex/file/name{,backup}
algunos otros usos
# to display the diff between /etc/rc.conf and /etc/rc.conf.pacsave
diff /etc/rc.conf{,.pacsave}
# to list files in both /usr/share and /usr/local/share
ls /usr/{,local}/share
Expansión Aritmética :
La expansión aritmética permite la evaluación de una expresión aritmética y la sustitución del resultado. El formato para la expansión aritmética es:
$((expression))
La expresión se trata como si estuviera entre comillas dobles, pero una comilla doble entre paréntesis no se trata especialmente. Todos los tokens en la expresión experimentan expansión de parámetros, expansión de cadena, sustitución de comandos y eliminación de comillas. Las expansiones aritméticas pueden estar anidadas.
$ a=1
$ b=2
$ echo $(( a+(b*2) ))
5
foo[123]
que se expandirá foo1 foo2 foo3
, pero deben ser nombres de archivo para trabajar en ese caso
Esto suele estar en mi script de inicio (.bashrc, .profile, lo que sea)
shopt
Dios mío, mira los comentarios:
shopt -s cdspell # try to correct typos in path
shopt -s dotglob # include dotfiles in path expansion
shopt -s hostcomplete # try to autocomplete hostnames
Un alias que guarda las pulsaciones de teclas:
mkdir
y cd
en él:
mkcd () { mkdir -p "$@" && cd "$@"; }
Y por último pero no menos importante, he renunciado a memorizar la sintaxis del alquitrán, así que:
extract () {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xjf $1 ;;
*.tar.gz) tar xzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) rar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xf $1 ;;
*.tbz2) tar xjf $1 ;;
*.tgz) tar xzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*) echo "'$1' cannot be extracted via extract()" ;;
esac
else
echo "'$1' is not a valid file"
fi
}
mkcd
que yo llamo id md
. Sin embargo, el uso de "$ @" como argumento para cd no tiene ningún sentido ya que no puede cd en más de un directorio. "$ @" funcionará para mkdir, pero entonces está manejando los argumentos de manera diferente para mkdir y cd, por lo que preferiría sugerirmd () { mkdir -p "$1"; cd "$1" }
Dos funciones bash que me ahorran muchas pulsaciones de teclas.
Haga automáticamente un ls después de cada cd exitoso:
function cd {
builtin cd "$@" && ls
}
Sube n niveles:
# Usage .. [n]
function .. (){
local arg=${1:-1};
local dir=""
while [ $arg -gt 0 ]; do
dir="../$dir"
arg=$(($arg - 1));
done
cd $dir #>&/dev/null
}
builtin foo
para evitar tener una función definida cd
; He estado usando chdir
en mis funciones. Práctico
cd() { builtin cd -- "$@" && { [ "$PS1" = "" ] || ls -hrt --color; }; }
Como generalmente estoy a mitad de camino en una línea de comando antes de querer buscar (CTRL-R en bash) tengo lo siguiente en mi .bashrc
bind '"\e[A"':history-search-backward
bind '"\e[B"':history-search-forward
Esto significa que si escribo cd y luego presiono arriba / abajo, puedo ver todas las opciones a las que he hecho cd. Básicamente, uso esto para directorios de uso frecuente. Como "cd w" y estoy terminando revisando todos los espacios de trabajo que uso mucho.
Una cosa que me ahorra mucho tiempo son los comandos pushd / popd. Estos chicos te permiten crear una pila de directorios y reducir mucho la escritura:
/foobar/ > pushd /src/whatever/foo/test
/foobar/src/whatever/foo/test > make run
/foobar/src/whatever/foo/test > popd
/foobar/ > make
u
y o
defender aquí?
setopt autopushd
y todos los cambios en el directorio se enviarán automáticamente
El screen
comando . Básicamente guarda su sesión de línea de comando para cuando regrese. Es una especie de administrador de terminales, como un administrador de ventanas. De esa manera, en una sola sesión de terminal, puede tener múltiples terminales virtuales en funcionamiento. Es muy genial.
Si se usa screen
, esta función de shell (ponerlo en .bashrc
) es extremadamente útil:
function scr {
if screen -ls | grep -q Main; then
# reattach to Main:
screen -xr Main
else
# name session "Main":
screen -S Main
fi
}
al escribir scr
, verificará si su sesión principal existe y se adjuntará a ella. De lo contrario, lo creará.
Si necesita editar una línea de comando particularmente larga en bash
^X^E (Ctrl-X Ctrl-E)
lo abrirá en el editor ($ EDITOR).
En zsh puede obtener el mismo comportamiento agregando esto a .zshrc:
autoload edit-command-line
zle -N edit-command-line
bindkey '^X^e' edit-command-line
Si usted es un mecanógrafo rápido, estos son útiles:
alias grpe='grep --color=tty'
alias gpre='grep --color=tty'
alias rgep='grep --color=tty'
alias gerp='grep --color=tty'
Esta macro le ayuda a calcular los totales de una columna de salida: tamaños de archivo, bytes, paquetes, todo lo que tiene que hacer es especificar la columna que desea agregar:
total ()
{
if [ x$1 = x ]; then set `echo 1`; fi
awk "{total += \$$1} END {print total}"
}
Lo usa así, por ejemplo, sin argumentos, agrega el total de la primera columna:
du | total
Si proporciona el argumento, sumará esa columna, por ejemplo, esto le da el número total de bytes utilizados por todos los archivos C # en / tmp:
ls -l /tmp/*cs | total 5
A veces su consola se estropea porque accidentalmente vio un archivo binario (cat / bin / ls por ejemplo), puede restaurar el terminal con esta función de shell:
restaura ()
{
perl -e 'print "\e)B";'
}
Me gusta que mi ls use caracteres para distinguir la clase de archivos y también para ocultar los archivos de respaldo generados por mi editor (los archivos de respaldo terminan con el carácter ~):
alias ls='ls -FB'
s/fast/sloppy/
reset
donde tú usas restaura
.
alias s='sudo'
alias r='rake' # i'm a ruby developer
alias ..='cd ..' # although with autocd feature for zsh this comes packed.
Uno de mis favoritos cuando olvido s
:
$ s !! # last command with super user priviledges
bindkey -s '\e[12~' "sudo !!\n"
vincular (en este caso) F2 para ejecutar ese comando. Tengo ese enlace, así que cuando ejecuto algo y veo el mensaje de error "olvidaste 'sudo', tonto", puedo apuñalar a F2 con molestia
Si un comando toma una entrada estándar, puede leer la entrada de un archivo con <filename
. Esto puede aparecer en cualquier parte del comando, por lo que estas líneas son equivalentes:
cat filename
cat <filename
<filename cat
Esto es particularmente útil para grep, ya que le permite colocar la expresión al final de la línea, por lo que puede modificar rápidamente un comando grep presionando Up, sin necesidad de desplazarse hacia la izquierda para pasar el nombre del archivo:
<filename grep 'expression'
<input foo | bar | baz >output
, no funciona si intenta mezclar algunas primitivas de bucle de concha como while
o for
en el medio. Así que me di por vencido y lo puse al final según la convención.
Puede usar CDPATH
para configurar el directorio equivalente a PATH
; si lo intenta cd foo
y no hay ninguno foo
en el directorio actual, el shell verificará cada uno de los directorios CDPATH
buscando foo
en ellos y cambiará al primero que encuentre:
export CDPATH="/usr"
cd bin # switches to 'bin' if there is one in the current directory, or /usr/bin otherwise
vi `which scriptname`
Para cuando no sabes dónde vive algo y tampoco te importa.
which
automáticamente, entoncesvi =scriptname
$(scriptname)
El comercial . Pone su comando en segundo plano, para que pueda seguir escribiendo.
$> sudo updatedb &
Trabajando juntos, y después de un tiempo ves:
[1] 17403
¡Y tu proceso está hecho! Ideal para cosas en las que no necesita esperar a que terminen.
&!
al fondo el trabajo y desconéctelo del shell!
bash
.
nohup
logra esto.
Pestaña completada . ¿Qué tan mal sería tener que escribir todos los caracteres de cada ruta?
rm -fr /
. Así que sí, la finalización de Tab es bastante vital ...
ls /usr/lib/game-d*/rott*
rm -rf /
deshabilitado en la mayoría de los sistemas Linux?
Desmontar el último dispositivo montado:
mount /media/whatever
...
u!mo
!mo
se expande al último comando que comenzó con mo
(al menos en bash). A veces uno lo hace mv
en el medio, por u!m
lo que no funcionará con tanta frecuencia.
Tengo esto en mi .bashrc
#shortcut for CTRL+C and CTRL+V
alias c-c='xclip -sel clip'
alias c-v='xclip -o -sel clip'
function find-all() {
python -c "import re
import sys
for i in re.findall('$1', sys.stdin.read()):
if type(i) == type(''):
print i
else:
print i[0]"
}
Y cuando tengo el código fuente html en el portapapeles y quiero encontrar todos los enlaces que uso
c-v | find-all 'href="([^"]*)"' | c-c
Y tengo todas las URL en el portapapeles
También tengo esta función
function lsq(){
ls -lh $@ | tr -s ' ' | cut -d' ' -f5,8
}
qué tamaño de pantalla (legible por humanos) y nombre de archivo.
alias temp='cat /proc/acpi/thermal_zone/THRM/temperature'
este alias es para mostrar la temperatura
function separate() {
python -c "import sys,re; print '$1'.join(re.split('\s*', sys.stdin.read().strip()))";
}
Con esta función puedo calcular el producto o la suma de argumentos.
alias sum='separate + | bc'
alias product='separate * | bc'
function split-join() {
python -c "import sys,re; print '$2'.join(re.split('$1', sys.stdin.read().strip()))";
}
Esta es una función útil que divide la entrada estándar separada por expresiones regulares y luego une el resultado.
function factorial() {
seq -s* $1 | bc
}
función factorial
function wiki() { dig +short txt $1.wp.dg.cx; }
Esta función muestra texto wiki sobre DNS
También tengo tres funciones de color.
function blue() {
echo -e "\x1b[34m\x1b[1m"$@"\x1b[0m";
}
function green() {
echo -e "\x1b[32m\x1b[1m"$@"\x1b[0m";
}
function red() {
echo -e "\x1b[31m\x1b[1m"$@"\x1b[0m";
}
function md5check() {
test `md5sum $2 | cut -d' ' -f1` = "$1" && green [OK] || red [FAIL]
}
Esta función valida el archivo md5 hash.
esto mostrará un mensaje de error para un código dado
function strerror() { python -c "import os; print os.strerror($1)"; }
Puede imprimir todos los mensajes con
alias all-errors='for i in `seq 131`; do echo -n "$i: "; strerror $i; done'
Otro truco útil de ZSH:
Trate la salida de un comando como un archivo:
emacs =(hg cat -r 100 somefile)
Esto abre una versión anterior de un archivo con seguimiento de Mercurial en emacs para una visualización resaltada de sintaxis. Sin eso, tendría que perder el tiempo con hg revert
, hg archive
o explícitamente enviar hg cat
la salida a un archivo temporal.
Por supuesto, esto funciona con cualquier programa que abra archivos y cualquier programa que imprima a la salida estándar.
Una característica específica de ZSH son los alias de sufijo, configurados al dar alias
la -s
bandera:
alias -s ext=program
Si una extensión dada tiene un alias de sufijo, puede ejecutar un archivo con esa extensión directamente, y ZSH iniciará el programa dado y pasará el nombre del archivo como argumento. Entonces, si el alias anterior está vigente, estas líneas son equivalentes:
/path/to/foo.ext
program /path/to/foo.ext
Una de mis características favoritas de todos los tiempos de ZSH son los directorios con nombre. Puede exportar una variable con un nombre determinado, con un valor que apunta a una ruta determinada:
export foo=/usr/bin
Ahora puede usar ~foo
un comando para referirse a /usr/bin
:
cd ~foo
~foo/ls
cat ~foo/filename
Ver esta cuestión .
Cuando corres ps ax | grep string
:
[steve@sage-arch ~]$ ps ax | grep 'openbox'
3363 ? Ss 0:00 /usr/bin/openbox
3382 ? Ss 0:00 /usr/bin/ssh-agent -- /usr/bin/openbox-session
3386 ? S 0:00 /bin/sh /usr/bin/openbox-session
3388 ? S 0:00 /bin/sh /usr/bin/openbox-session
3389 ? S 0:00 /bin/sh /usr/bin/openbox-session
3390 ? S 0:00 /bin/sh /usr/bin/openbox-session
5100 pts/0 S+ 0:00 grep openbox
la última línea que contiene grep
es algo un poco molesto
Puede deshacerse de esto ejecutando ps ax | grep '[s]tring'
:
[steve@sage-arch ~]$ ps ax | grep '[o]penbox'
3363 ? Ss 0:00 /usr/bin/openbox
3382 ? Ss 0:00 /usr/bin/ssh-agent -- /usr/bin/openbox-session
3386 ? S 0:00 /bin/sh /usr/bin/openbox-session
3388 ? S 0:00 /bin/sh /usr/bin/openbox-session
3389 ? S 0:00 /bin/sh /usr/bin/openbox-session
3390 ? S 0:00 /bin/sh /usr/bin/openbox-session
actualización : o simplemente ejecutarpgrep string
'[o]penbox'
). Los corchetes funcionarán como una especie de globo, por lo que si hay openbox en su directorio (digamos que está dentro /usr/bin
) bash solo usará openbox, lo que evitará el truco grep.
El comando no hacer nada :
como en
while :; do :; done
Expansión de abrazaderas en combinación con bucles for:
for c in {1..3}; do :; done
!
operadores y operadores de cortocircuito ||
y&&
[ -d /tmp/dir ] || mkdir /tmp/dir
if ! ping 34.41.34.1; then :; fi
usando sub shells en lugar de pop / push (es útil en scripts)
~$ ( cd /tmp; echo $PWD )
/tmp
~$
el tipo de comando que estype
~$ type type
type is a shell builtin
~$ type ls
ls is aliased to `ls --color=auto'
~$ f(){ :; }
~$ type f
f is a function
f ()
{
:
}
también muy agradable: cuerdas aquí
~$ cat <<<"here $PWD"
here /home/yourname
~$
y mi favorito: redirección en una lista de comandos
{ w; ps; ls /tmp; } 2>/dev/null |less
Me encanta meter tantas cosas como puedo en mi PS1. Algunas cosas útiles para recordar:
\e[s
y \e[u
guarde y salve la posición del cursor respectivamente. Lo uso para crear una 'barra de información' en la parte superior de la pantalla, un par de líneas de largo, que puede caber más cosas. Ejemplo:
PS1='\[\e[s\e[7m\e[1;1H\]\w\n\t \j / \! / \#\[\e[u\e[0m\e[33;1m\][\u@\h \[\e[34m\]\W]\[\e[0m\]\$ '
Combinar con alias clear='echo -e "\e[2J\n"'
. ¡Pruébalo!
Además, la PROMPT_COMMAND
variable define un comando para ejecutar antes de la PS1 cada vez.
Otro es el bg
comando. Si olvida poner &
al final de un comando, simplemente presione ^Zy escriba bg
, y se ejecutará en segundo plano.
bg
, cuando tengo un programa ejecutándose en segundo plano y fg
PS1
así que pongo la mayoría de las cosas que quiero en el fondo de mi pantalla ...