¿Cuáles son tus características o trucos favoritos de la línea de comandos?

94

Comparta sus características y trucos de línea de comandos para Unix / Linux. Intente mantenerlo agnóstico de concha / distro si es posible. Interesado en ver alias, líneas simples, atajos de teclado, pequeños scripts de shell, etc.

Casey
fuente

Respuestas:

89

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).

  • El historycomando 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
  • !-Nsustituirá al N XX comando más reciente; Por ejemplo !-1, sustituirá el comando más reciente, !-2el segundo más reciente, etc.
  • Como se menciona en la otra respuesta, !!es una forma abreviada de !-1sustituir 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 !!:0es equivalente a !:0.

  • !:0 obtendrá el comando que se ejecutó
  • !:1obtendrá el primer argumento (y !:2el 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 base
  • t - Solo el nombre de archivo base
  • r - En línea con la extensión del nombre de archivo
  • e - Solo la extensión del nombre del archivo
  • s/search/replacement- Reemplazar la primera aparición de searchconreplacement
  • gs/search/replacement- Reemplace todas las ocurrencias de searchconreplacement
Michael Mrozek
fuente
3
Y si está utilizando Bash (podría ser lo mismo para ciertos otros shells), M- ^ (Meta- ^) expande los operadores de expansión del historial anteriores para usted, en caso de que desee ver a qué se refiere realmente a.
Eric Smith
1
Nunca he encontrado un uso para el! ordenar cosas. Simplemente me parece malo ejecutar un comando que no estoy viendo. ¡Sería tan fácil escribir! -3 en lugar de! -4, y quién sabe qué podría pasar. Encontrar el número de línea del comando que quiero ejecutar suele ser más difícil de lo que vale. Sin embargo, trucos geniales, pero nunca he encontrado un uso real para ellos.
Falmarri
1
@Falmarri Yo nunca uso !-#los tampoco. Utilizo !stringpara 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
Michael Mrozek
1
¡No! :) "Running !Nejecutará el comando ..." es una descripción demasiado limitada; en realidad, !Nserá 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 !!.
imz - Ivan Zakharyaschev
1
Para ejecutar comandos anteriores buscados por una cadena, generalmente solo presiono Ctrl-R. Múltiples Ctrl-R profundizarán en la historia. De esta manera, veo el comando encontrado de inmediato, y puedo descartarlo y buscar más. Ctrl-G escapa de este modo. El único inconveniente es que Ctrl-R es para 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 eshellen Emacs). Así que a menudo los arruino.
imz - Ivan Zakharyaschev
65

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.

chile
fuente
11
También puede usar! $ Para referirse al último argumento en el comando anterior. Esto es útil porque funciona tanto en scripts como interactivamente. (Funciona en bash y zsh)
44
Cada vez que se pulsa 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.
clee
2
Esta es la combinación de teclas predeterminada para el yank-last-argcomando readline, por lo que debería funcionar con cualquier programa vinculado a readline, no solo BASH o ZSH.
James Sneeringer
En modo vi, tuve que volver a vincular yank-last-arg según esta respuesta: superuser.com/questions/18498/…
Jeromy Anglim
En xterm, meta-. produce ®, pero puede usar esc en lugar de meta (en general en bash), por lo que esc-. en lugar.
derobert
49

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.

terdon
fuente
2
El ascii programa separado también es útil. Además de imprimir una tabla, le permite consultar uno o más caracteres individuales.
Matthew Flaschen
46

Ejecute el último comando como root:

sudo !!
Alex B
fuente
42

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+ U- Corta la línea actual
  • Ctrl+ Y- Pega un corte de línea con Ctrl+U
  • Ctrl+ L- Borrar la pantalla y volver a dibujar la línea actual
  • Ctrl+ G- Obtén una nueva línea y abandona la actual
Michael Mrozek
fuente
55
Solo para agregar algunos a estos: Ctrl + A para ir al comienzo de la línea, Ctrl + E para ir al final de la línea, Ctrl-K para borrar desde el cursor hasta el final de la línea.
rsuarez
Ctrl+Lcorresponde 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.
hlovdal
Agregar a la lista de teclas de acceso rápido: Ctrl+Wcortar una palabra hacia atrás, Alt+Favanzar una palabra, Alt+Bir una palabra hacia atrás en una línea. Me gusta Ctrl+Yy Shift+Insertporque 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).
36

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!

Aaron Bockover
fuente
8
alias mk=makeMás rápido de escribir y menos probabilidades de equivocarse. O compile desde su editor usando una tecla de
acceso
Por cierto, Zsh tiene una corrección ortográfica incorporada que es muy buena para corregir errores tipográficos simples.
Adam Byrtek
También en zsh, creo que el valor predeterminado es cuando presionas la tecla arriba, hace una búsqueda en el historial como si hubieras presionado ctrl r. Puede que no sea el predeterminado, pero es una configuración.
Falmarri
Lo consideraría alias m=make, o incluso m=make -j6o similar, excepto que ya uso alias m=mutt
jmtd
31

diff La salida de dos comandos sin crear un archivo temporal manualmente (bash):

diff <(ls dir1) <(ls dir2)
Alex B
fuente
Esto también es muy útil commya que solo toma archivos, pero en muchos casos es un desperdicio de inodos.
Marcin
30

Bastante básico, pero la gente no parece saberlo, te devuelve al directorio anterior:

cd -
Robert Swisher
fuente
Te digo, cd..desde DOS está arraigada en mi memoria muscular ...
LawrenceC
Sin embargo, esta es una versión barata de pushd y popd ...
Robert Massaioli
Del mismo modo, hay cd(sin argumento) que lo lleva a su directorio de inicio.
Mei
Si, eso es una locura. ¿Dónde en la página del manual muestra la expansión de '-'? Siempre intento (y olvido) usar pushd / popd
Chuck R
29

Expansión de la abrazadera :

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
Stefan
fuente
3
Bien, no puedo creer que me haya olvidado de esto. También hay un más compacto foo[123]que se expandirá foo1 foo2 foo3, pero deben ser nombres de archivo para trabajar en ese caso
Michael Mrozek
jeje .. gracias ... aprende algo todos los días +1
Stefan
29

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: mkdiry cden é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
}
sygo
fuente
55
+1, ¿por qué no pensé en eso? (extracto)
MAK
Tengo una función similar a la mkcdque 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" }
hlovdal
¿Cómo agrego esos comandos? solo pegar como está en .bashrc o agregar "alias" antes de ellos?
Asaf
22

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
}
Maik
fuente
44
Nunca me di cuenta de que podía hacer builtin foopara evitar tener una función definida cd; He estado usando chdiren mis funciones. Práctico
Michael Mrozek
Increíble. ¡Solo agregue -F a ls en la función cd y es perfecto (para mí)!
frabjous
2
Hago lo mismo que usted para el CD, pero tengo algunos controles de sanidad más y evito hacer ls en modo no interactivo:cd() { builtin cd -- "$@" && { [ "$PS1" = "" ] || ls -hrt --color; }; }
jmtd
17

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.

mendicante
fuente
Éste es genial ! Extiende el comportamiento de las flechas sin romper su funcionalidad básica. ¡Gracias!
philfr
17

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
jacksonh
fuente
2
¡Si! alias u = pushd; alias o = popd
primos enlatados
2
.. y qué hacer uy odefender aquí?
deizel
@deizel: nada específico, solo un atajo para evitar escribir.
Adam Byrtek
2
Parece la segunda letra del comando, ya que ambos comienzan con p, no puede usar eso para ambos.
camh
En ZSH puedes setopt autopushdy todos los cambios en el directorio se enviarán automáticamente
Michael Mrozek
14

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á.

Sebastián
fuente
técnicamente, es un programa en sí mismo, no un "comando".
unperson325680
1
Recomiendo tmux o dvtm sobre la pantalla. Son reemplazos más modernos y más limpios.
deltaray
Sí, "tmux" es indiscutiblemente mucho mejor que la pantalla.
ColinM
También sigue más de cerca la convención de Unix de nombres abreviados y poco intuitivos :)
user394
13

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 
redactado
fuente
Wow, ese entra en el libro.
l0b0
Sí, y en mis notas!
jyz 01 de
12

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'
revs miguel.de.icaza
fuente
No olvides: alias gerp = 'grep --color = tty' Lo hago todo el tiempo ;-)
Robert Swisher
1
En lo que a mí respecta, "rápido" no cuenta si no soy exacto. También es posible que desee ver las variables GREP_COLORS y GREP_OPTIONS.
Andy Lester
2
s/fast/sloppy/
Josh
1
Yo uso resetdonde tú usas restaura.
jmtd
11
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
Eimantas
fuente
2
Si usa ZSH, puede hacer algo como 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
Michael Mrozek
Mala tecla F2 ....)
Eimantas
Uso esto todo el tiempo. Me olvido constantemente de escribir sudo antes de editar mi archivo de hosts. Si eso sucede, solo ejecuto sudo !!. +1
Brian Wigginton
10

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'
Michael Mrozek
fuente
3
Un buen consejo! Vale la pena señalar que esto en realidad no reordena los argumentos del comando. En su lugar, canaliza el archivo en el proceso 'STDIN, ya que grep ahora no tiene argumento de archivo, por defecto es lectura de STDIN. Comprender esto abrirá muchas oportunidades para usar esta técnica con otros comandos y también ayudará a las personas a comprender qué sucede cuando las cosas no funcionan como se esperaba. Para obtener más información, busque tuberías y redirectores: dsj.net/compedge/shellbasics1.html
chillitom
@chill Buenos puntos; En realidad, la sugerencia estaba tan mal redactada como para estar esencialmente equivocada. Lo reescribí en función de tu comentario
Michael Mrozek
Algo que descubrí recientemente: puede redirigir la entrada a los bucles (para, mientras, etc.). Consulte faqs.org/docs/abs/HTML/redircb.html .
Lucas Jones
Convencionalmente pones la redirección al final. Si bien la metáfora de la tubería se ve mejor <input foo | bar | baz >output, no funciona si intenta mezclar algunas primitivas de bucle de concha como whileo foren el medio. Así que me di por vencido y lo puse al final según la convención.
jmtd
@jmtd Bueno, ponerlo al final elimina "Esto es particularmente útil para grep, ya que le permite colocar la expresión al final de la línea, para que pueda modificar rápidamente un comando grep presionando Arriba, sin necesidad de desplazarse a la izquierda para pasar el nombre del archivo "
Michael Mrozek
9

Puede usar CDPATHpara configurar el directorio equivalente a PATH; si lo intenta cd fooy no hay ninguno fooen el directorio actual, el shell verificará cada uno de los directorios CDPATHbuscando fooen 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
Michael Mrozek
fuente
3
Esto puede causar problemas. Consulte softpanorama.org/Scripting/Shellorama/cdpath.shtml "Si se establece $ CDPATH, el cd incorporado no agregará implícitamente el directorio actual. Esto significa que cd fallará si no se puede construir un nombre de directorio válido a partir de cualquier de las entradas en $ CDPATH, incluso si existe un directorio con el mismo nombre dado como argumento para cd en el directorio actual ". Me ha mordido esto, algunos Makefile han dejado de funcionar. Anexar aunque explícitamente podría ayudar, pero hay algunos problemas con eso también.
Ustun
9
vi `which scriptname`

Para cuando no sabes dónde vive algo y tampoco te importa.

Matt Simmons
fuente
8
No quiero seguir conectando las funciones de ZSH, pero sigo pensando en ellas mientras otras personas responden :). En ZSH puedes hacer = foo para invocar whichautomáticamente, entoncesvi =scriptname
Michael Mrozek
Si tiene problemas para buscar el carácter de backtick, también puede usarlo$(scriptname)
Patrick
9

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.

usuario394
fuente
11
Y si su aplicación es GUI, es probable que no desee que se mantenga en trabajos. ¡Agregue &!al fondo el trabajo y desconéctelo del shell!
unperson325680
@progo: Eso no funciona para mí bash.
Nathan Osman
@Jorge. Parece que tienes razón. Aprendí que zsh lo soportaba, y luego escuché que bash también lo soportaba. Oh my :(
unperson325680
1
@progo: Resulta que anteponer el comando con nohuplogra esto.
Nathan Osman
8

Pestaña completada . ¿Qué tan mal sería tener que escribir todos los caracteres de cada ruta?

usuario394
fuente
55
Hay suicidio Linux. Si escribe incorrectamente el comando, lo hace rm -fr /. Así que sí, la finalización de Tab es bastante vital ...
Eimantas
No es tan malo como podría pensar (pero sigue siendo malo), simplemente rocía comodines en todas partes:ls /usr/lib/game-d*/rott*
jmtd
@Eimantas ¿No está rm -rf /deshabilitado en la mayoría de los sistemas Linux?
Bernhard Heijstek
@phycker: mencioné Suicide Linux, no "todos".
Eimantas
7

Desmontar el último dispositivo montado:

mount /media/whatever
...
u!mo

!mose expande al último comando que comenzó con mo(al menos en bash). A veces uno lo hace mven el medio, por u!mlo que no funcionará con tanta frecuencia.

Roberto Bonvallet
fuente
Use Ctrl + Shift + 6 (Ctrl + ^) para expandir el comando sin ejecutarlo como precaución de seguridad
ColinM
7

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'
jcubic
fuente
6

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 archiveo explícitamente enviar hg catla 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.

Matthew Flaschen
fuente
55
Puedes hacer esto en bash con el <()
ScaryAardvark
5

Una característica específica de ZSH son los alias de sufijo, configurados al dar aliasla -sbandera:

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
Michael Mrozek
fuente
Esto es algo que realmente extrañé de Windows ... hasta que me di cuenta de que "programa" siempre era emacs, así que dejé de usar shell para abrir archivos y simplemente usé Cx Cf (duh).
harpo
5

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 ~fooun comando para referirse a /usr/bin:

cd ~foo
~foo/ls
cat ~foo/filename
Michael Mrozek
fuente
si su mensaje muestra el directorio de trabajo actual, los nombres de las variables también se utilizarán allí hasta donde recuerdo.
Andre Holzner
4

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 grepes 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

Stefan
fuente
Sí, muy útil. Sin embargo, debe citar openbox ( '[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.
Rich Homolka
4
  • 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
artistoex
fuente
3

Me encanta meter tantas cosas como puedo en mi PS1. Algunas cosas útiles para recordar:

\e[sy \e[uguarde 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_COMMANDvariable define un comando para ejecutar antes de la PS1 cada vez.

Otro es el bgcomando. Si olvida poner &al final de un comando, simplemente presione ^Zy escriba bg, y se ejecutará en segundo plano.

Lucas Jones
fuente
gracias por bg, cuando tengo un programa ejecutándose en segundo plano y fg
presiono
Me gusta una limpieza, PS1así que pongo la mayoría de las cosas que quiero en el fondo de mi pantalla ...
Josh