Quais são seus recursos ou truques favoritos da linha de comando?

94

Compartilhe seus recursos e truques da linha de comando para Unix / Linux. Tente manter o shell / distro agnóstico, se possível. Interessado em ver aliases, one-liners, atalhos de teclado, pequenos scripts de shell, etc.

Casey
fonte

Respostas:

89

Isso se expande um pouco no !!truque mencionado nesta resposta . Na verdade, existem vários comandos relacionados ao histórico que tendem a ser esquecidos (as pessoas tendem a esfaquear Up100 vezes, em vez de procurar um comando que sabem que digitaram).

  • O historycomando mostrará uma lista de comandos executados recentemente com um designador de eventos à esquerda
  • !N substituirá o comando associado ao designador de evento N
  • !-Nsubstituirá o N th comando mais recente; por exemplo !-1, substituirá o comando mais recente, !-2o segundo mais recente etc.
  • Como mencionado na outra resposta, !!é uma abreviação de !-1, para substituir rapidamente o último comando
  • !string substituirá o comando mais recente que começa com string
  • !?string? substituirá o comando mais recente que contém string

Designadores de palavras podem ser adicionados a um !comando de histórico para modificar os resultados. Dois pontos separam o evento e os designadores de palavras, por exemplo !!:0. O designador de evento !!pode ser abreviado para apenas !ao usar um designador de palavras, portanto !!:0é equivalente a !:0.

  • !:0 receberá o comando que foi executado
  • !:1receberá o primeiro argumento (e !:2o segundo, etc.)
  • !:2-3 receberá o segundo e o terceiro argumentos
  • !:^é outra maneira de obter o primeiro argumento. !:$receberá o último
  • !:*receberá todos os argumentos (mas não o comando)

Os modificadores também podem ser anexados a um !comando de histórico, cada um prefixado por dois pontos. Qualquer número pode ser empilhado (por exemplo !:t:r:p).

  • h - Alinhar com o nome do arquivo base
  • t - Apenas o nome do arquivo base
  • r - Alinhar até a extensão do nome do arquivo
  • e - Apenas a extensão do nome do arquivo
  • s/search/replacement- Substitua a primeira ocorrência de searchporreplacement
  • gs/search/replacement- Substitua todas as ocorrências de searchporreplacement
Michael Mrozek
fonte
3
E se você estiver usando o Bash (pode ser o mesmo para alguns outros shells), M- ^ (Meta- ^) expande os operadores de expansão do histórico acima para você, caso você queira ver o que realmente está se referindo para.
Eric Smith
1
Eu nunca encontrei um uso para o! comandar as coisas. Parece-me ruim executar um comando que não estou vendo. Seria tão fácil digitar! -3 em vez de! -4, e quem sabe o que poderia acontecer. Encontrar o número da linha do comando que quero executar geralmente é mais trabalhoso do que vale a pena. Truques legais, porém, mas nunca achei um uso real para eles.
Falmarri
1
@Falmarri Eu nunca uso esses !-#também. Eu uso !stringpara executar o último comando que começa com a corda, mas eu geralmente guia completar-lo primeiro (zsh) para ter certeza que eu estou correndo a coisa certa
Michael Mrozek
1
Não! :) "A execução !Nexecutará o comando ..." é uma descrição muito estreita; na verdade, !Nserá substituído pelo comando ...; e assim por diante para todas as descrições na resposta. Mais correto e abrindo possibilidades muito mais úteis! Por exemplo, o mencionado sudo !!.
IMZ - Ivan Zakharyaschev
1
Para executar comandos anteriores procurados por uma string, normalmente eu apenas pressione Ctrl-R. Ctrl-R múltiplo vai cavar mais fundo na história. Dessa forma, vejo o comando encontrado imediatamente e posso descartá-lo e procurar mais. Ctrl-G escapa deste modo. O único inconveniente é que Ctrl-R é para bash; no Emacs, para navegar pelo histórico de comandos e valores de entrada (para Mx ou outros valores de leitura), é usado o Meta-R (o Meta-R também é usado eshellno Emacs). Então muitas vezes eu estrago tudo.
IMZ - Ivan Zakharyaschev
65

bash - insere o parâmetro final da linha anterior

alt- . a combinação de teclas mais útil de todos os tempos, experimente e veja, por algum motivo, ninguém sabe sobre esse.

pressione repetidamente para selecionar os últimos parâmetros mais antigos.

ótimo quando você quer fazer algo mais com o argumento / arquivo que você usou apenas um momento atrás.

chillitom
fonte
11
Você também pode usar! $ Para se referir ao último argumento no comando anterior. Isso é útil porque funciona tanto em scripts quanto interativamente. (Funciona em bash e zsh)
4
Cada vez que você pressiona alt- .ele acessa o comando anterior e extrai o último argumento dele. Portanto, se você quiser o último argumento de três comandos atrás, basta pressionar alt- .três vezes.
usar o seguinte comando
2
Essa é a ligação de chave padrão para o yank-last-argcomando readline, portanto, ele deve funcionar com qualquer programa vinculado à readline, não apenas BASH ou ZSH.
James Sneeringer
Em modo vi, eu tinha de religar puxão-last-ARG como por esta resposta: superuser.com/questions/18498/...
Jeromy Anglim
No xterm, meta-. produz ®, mas você pode usar esc em vez de meta (em geral no bash), então esc-. em vez de.
derobert
49

Meu favorito é

man 7 ascii

Simples e muito ú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

Dê uma olhada neste site commandlinefu.com .

Você também pode dar uma olhada nestes quatro artigos de Peteris Krumins em seu blog

terdon
fonte
2
O ascii programa separado também é útil. Além de imprimir uma tabela, permite consultar um ou mais caracteres individuais.
Matthew Flaschen
46

Execute o último comando como root:

sudo !!
Alex B
fonte
42

Não tenho certeza se isso conta como um "truque", mas as pessoas parecem desconhecer as teclas de atalho padrão da linha de leitura. De uso particular em conchas:

  • Ctrl+ U- Cortar a linha atual
  • Ctrl+ Y- Cole uma linha recortada com Ctrl+U
  • Ctrl+ L- Limpe a tela e redesenhe a linha atual
  • Ctrl+ G- Obtenha uma nova linha e abandone a atual
Michael Mrozek
fonte
5
Apenas para adicionar um pouco a eles: Ctrl + A para ir para o início da linha, Ctrl + E para ir para o fim da linha, Ctrl-K para apagar do cursor até o final da linha.
rsuarez
Ctrl+Lcorresponde ao caractere ascii FormFeed. Ele geralmente redesenha a tela em aplicativos de texto com uma janela de tela (por exemplo, vim, less, mc, etc). Bom se a tela foi "poluída" por alguma saída de outro programa.
hlovdal
Adicionando à lista de teclas de atalho: Ctrl+Wcortar uma palavra para trás, Alt+Favançar uma palavra, Alt+Bavançar uma palavra em uma linha. Eu gosto Ctrl+Ye Shift+Insertporque você pode ter duas linhas copiadas. Uma com Ctrl+U(cole-a com Ctrl+Y) e ao mesmo tempo você pode copiar outra palavra (selecione a linha) e cole com ( Shift+Insert).
36

CTRL+ Rno BASH para procurar / ativar comandos executados anteriormente (o conteúdo de ~ / .bash_history).

Isso geralmente é extremamente útil. A execução desse alias servirá o PWD por HTTP (indexado) na porta 8000:

alias webserver="python -m SimpleHTTPServer"

E como eu corro make o tempo todo, digito e digito rápido demais, esses aliases são provavelmente os mais usados ​​(sério):

alias maek=make
alias mkae=make
alias meak=make
alias amka=make
alias akme=make

E provavelmente o meu pedaço de BASH usado com mais frequência é um script simples que chamo de upload. Eu o uso para misturar qualquer tipo de conteúdo ao meu Linode e ele copia o URL HTTP resultante para a minha área de transferência (clique no meio). Muito útil para colar coisas para pessoas no IRC:

scp -r $* $user@$host:public_html && {
    URL="http://$host/~$user/$(basename $1)"
    echo "$URL"
    xselection -replace PRIMARY "$URL"
}

Apenas um par. Posso postar muito mais tarde, preciso voltar ao trabalho!

Aaron Bockover
fonte
8
alias mk=makeMais rápido para digitar e menos propenso a errar. Ou compile a partir do seu editor usando uma tecla de atalho ...
Lars Haugseth
O BTW Zsh possui uma correção ortográfica integrada que é muito boa para corrigir erros de digitação simples.
Adam Byrtek
Também no zsh, acho que o padrão é quando você pressiona a tecla para cima, faz uma pesquisa no histórico como se tivesse pressionado ctrl r. Pode não ser o padrão, mas é uma configuração.
Falmarri
Eu considero alias m=make, ou mesmo m=make -j6ou similar - só que eu já usam alias m=mutt
jmtd
31

diff a saída de dois comandos sem criar um arquivo temporário manualmente (bash):

diff <(ls dir1) <(ls dir2)
Alex B
fonte
Isso também é super útil comm, pois leva apenas arquivos, mas em muitos casos isso é um desperdício de inodes.
Marcin
30

Bastante básico, mas as pessoas parecem não saber, retorna ao diretório anterior:

cd -
Robert Swisher
fonte
Eu lhe digo, cd..a partir do DOS está entranhado na minha memória muscular ...
LawrenceC
Esta é uma versão barata de pushd e popd ...
Robert Massaioli
Da mesma forma, existe cd(sem argumento) que leva você ao seu diretório pessoal.
Mei
Sim, isso é loucura. Onde na página do manual mostra a expansão de '-'? Estou sempre tentando (e esquecer) para usar pushd / popd
Chuck R
29

Expansão de cinta :

A expansão de chaves é um mecanismo pelo qual cadeias arbitrárias podem ser geradas.

Permite substituir linhas tediosas como:

mv loong/and/complex/file/name loong/and/complex/file/name.bacukup

com uma instância mais curta

mv loong/and/complex/file/name{,backup}

alguns outros 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 

Expansão aritmética :

A expansão aritmética permite a avaliação de uma expressão aritmética e a substituição do resultado. O formato para expansão aritmética é:

$((expression))

A expressão é tratada como se estivesse entre aspas duplas, mas as aspas duplas entre parênteses não são tratadas especialmente. Todos os tokens na expressão passam por expansão de parâmetro, expansão de cadeia, substituição de comando e remoção de cotação. Expansões aritméticas podem ser aninhadas.

$ a=1
$ b=2
$ echo $(( a+(b*2) ))
5
Stefan
fonte
3
Bom, não acredito que esqueci disso. Há também um mais compacto foo[123]que irá expandir-se para foo1 foo2 foo3, mas eles precisam ser nomes de arquivos para trabalhar nesse caso
Michael Mrozek
hehe .. obrigado ... aprenda algo todos os dias +1
Stefan
29

Isso geralmente está no meu script de inicialização (.bashrc, .profile, qualquer que seja)

shopt Deus, verifique os comentários:

shopt -s cdspell        # try to correct typos in path
shopt -s dotglob        # include dotfiles in path expansion
shopt -s hostcomplete   # try to autocomplete hostnames

Um alias que salva as teclas digitadas: mkdire cdnele:

mkcd () { mkdir -p "$@" && cd "$@"; }

E por último mas não menos importante, eu desisti de memorizar a sintaxe do tar, então:

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
fonte
5
+1, por que não pensei nisso? (extrato)
MAK
Eu tenho uma função semelhante a mkcdapenas que eu nomeie id md. No entanto, o uso de "$ @" como argumento para cd não faz sentido, pois você não pode cd para mais de um diretório. "$ @" Irá trabalhar para mkdir, mas então você está lidando com argumentos diferentes para mkdir e cd, então eu prefiro sugerirmd () { mkdir -p "$1"; cd "$1" }
hlovdal
como adiciono esses comandos? basta colar como está no .bashrc ou adicionar "alias" antes deles?
Asaf
22

Duas funções do bash que me salvam muitos pressionamentos de tecla.

Faça automaticamente um ls após cada CD com êxito:

function cd {
    builtin cd "$@" && ls
}

Suba n níveis:

# 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
fonte
4
Eu nunca percebi que você poderia fazer builtin foopara ter uma função definida cd; Eu tenho usado chdirem minhas funções. Handy
Michael Mrozek
Impressionante. Basta adicionar -F a ls na função cd e é perfeito (para mim)!
Frabjous
2
Eu faço o mesmo que você para cd, mas eu tenho mais algumas checagens em e evitar fazer ls no modo não-interativo:cd() { builtin cd -- "$@" && { [ "$PS1" = "" ] || ls -hrt --color; }; }
jmtd
17

Como geralmente estou na metade da linha de comando antes de querer pesquisar (CTRL-R no bash), tenho o seguinte no meu .bashrc

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

Isso significa que, se eu digitar cd, pressione as teclas para cima e para baixo, posso ver todas as opções para as quais eu tenho cd. Basicamente, eu uso isso para dirs usados ​​com frequência. Como "cd w" e acabo passando por todos os espaços de trabalho que uso bastante.

mendicante
fonte
Este é mesmo bom ! Ele estende o comportamento das setas sem interromper sua funcionalidade básica.
philfr
17

Uma coisa que me poupa muito tempo são os comandos pushd / popd. Esses caras permitem criar uma pilha de diretórios e reduzir muito a digitação:

/foobar/ > pushd /src/whatever/foo/test
/foobar/src/whatever/foo/test > make run
/foobar/src/whatever/foo/test > popd
/foobar/ > make
jacksonh
fonte
2
Sim! alias u = pushd; alias o =
popd
2
.. e o que significa ue orepresenta aqui?
deizel
@deizel: Nada específico, apenas um atalho para evitar a digitação.
Adam Byrtek
2
Parece com a segunda letra do comando, já que ambos começam com p, você não pode usá-lo para ambos.
camh
No ZSH, você pode setopt autopushde todas as alterações de diretório serão enviadas automaticamente
Michael Mrozek
14

O screen comando . Basicamente, salva sua sessão de linha de comando para quando você voltar. É uma espécie de gerenciador de terminal, como um gerenciador de janelas. Dessa forma, em uma única sessão de terminal, você pode ter vários terminais virtuais em funcionamento. É muito legal.

Se alguém usar screen, essa função shell (coloque-a .bashrc) é extremamente útil:

function scr {
    if screen -ls | grep -q Main; then
         # reattach to Main: 
         screen -xr Main
    else
         # name session "Main":
         screen -S Main
    fi
   }

ao digitar scr, ele verificará se a sua sessão principal existe e será anexada a ela. Caso contrário, ele será criado.

Sebastian
fonte
tecnicamente, é um programa próprio, não um "comando".
unid325680
1
Eu recomendo tmux ou dvtm sobre a tela. São substituições mais modernas e limpas.
Deltaray
Sim, "tmux" é indiscutivelmente muito melhor que a tela.
ColinM
Ele também segue mais de perto a convenção unix de, nomes abreviados unintuitive :)
user394
13

Se você precisar editar uma linha de comando particularmente longa no bash

^X^E (Ctrl-X Ctrl-E) 

irá abri-lo no editor ($ EDITOR).

No zsh, você pode obter o mesmo comportamento adicionando isso ao .zshrc:

autoload edit-command-line
zle -N edit-command-line
bindkey '^X^e' edit-command-line 
redigido
fonte
Uau, esse entra no livro.
l0b0
Sim, e nas minhas anotações!
JYZ
12

Se você é um datilógrafo rápido, estes são úteis:

alias grpe='grep --color=tty'
alias gpre='grep --color=tty'
alias rgep='grep --color=tty'
alias gerp='grep --color=tty'

Essa macro ajuda a calcular os totais de uma coluna de saída: tamanhos de arquivo, bytes, pacotes, tudo o que você precisa fazer é especificar a coluna que você deseja adicionar:

total ()
{
        if [ x$1 = x ]; then set `echo 1`; fi
        awk "{total += \$$1} END {print total}"
}

Você o usa assim, por exemplo, sem argumentos, adiciona o total da primeira coluna:

du | total

Se você fornecer o argumento, ele somará a coluna, por exemplo, isso fornece o número total de bytes usados ​​por todos os arquivos C # em / tmp:

ls -l /tmp/*cs | total 5

Às vezes, seu console fica bagunçado porque você visualizou acidentalmente um arquivo binário (cat / bin / ls, por exemplo). É possível restaurar o terminal com esta função de shell:

restaura ()
{
    perl -e 'print "\e)B";'
}

Gosto do meu sl para usar caracteres para distinguir a classe de arquivos e também para ocultar os arquivos de backup gerados pelo meu editor (os arquivos de backup terminam com o caractere ~):

alias ls='ls -FB'
miguel.de.icaza
fonte
Não se esqueça: Alias Gerp = 'grep --color = tty' eu faço aquele o tempo todo ;-)
Robert Swisher
1
Para mim, "rápido" não conta se não for preciso. Você também pode querer examinar as variáveis ​​GREP_COLORS e GREP_OPTIONS.
Andy Lester
2
s/fast/sloppy/
Josh
1
Eu uso resetonde você usa 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.

Um dos meus favoritos quando esqueço s:

$ s !! # last command with super user priviledges
Eimantas
fonte
2
Se você usa o ZSH, pode fazer algo como bindkey -s '\e[12~' "sudo !!\n"ligar (neste caso) F2 para executar esse comando. Eu tenho essa ligação; portanto, quando executo alguma coisa e vejo a mensagem de erro "você esqueceu 'sudo', tolo", posso simplesmente esfaquear a F2 com aborrecimento
Michael Mrozek
Tecla F2 ruim ...).
Eimantas
Eu uso isso o tempo todo. Eu sempre esqueço de digitar sudo antes de editar meu arquivo de hosts. Se isso acontecer, eu apenas corro o sudo !!. 1
Brian Wigginton
10

Se um comando receber entrada stdin, você poderá ler a entrada de um arquivo com <filename. Isso pode aparecer em qualquer lugar do comando, portanto, essas linhas são equivalentes:

cat filename
cat <filename
<filename cat

Isso é particularmente útil para grep, pois permite colocar a expressão no final da linha, para que você possa modificar rapidamente um comando grep pressionando Up, sem precisar rolar para a esquerda para passar o nome do arquivo:

<filename grep 'expression'
Michael Mrozek
fonte
3
Uma boa dica! Vale notar que isso não reorganiza os argumentos do comando. Em vez disso, ele canaliza o arquivo no processo 'STDIN, pois o grep agora não possui nenhum argumento de arquivo, sendo padronizado para leitura em STDIN. Entender isso abrirá muitas oportunidades para usar essa técnica com outros comandos e também ajudará as pessoas a entender o que está acontecendo quando as coisas não funcionam como o esperado. Para mais informações procure tubos e redirecionadores: dsj.net/compedge/shellbasics1.html
chillitom
@chill Bons pontos; a gorjeta era na verdade redigida de maneira tão ruim que estava essencialmente errada. Reescrevi-o com base no seu comentário
Michael Mrozek
Algo que descobri recentemente: você pode redirecionar a entrada para loops (por, enquanto, etc.). Consulte faqs.org/docs/abs/HTML/redircb.html .
Lucas Jones
Convencionalmente, você coloca o redirecionamento no final. Embora a metáfora do pipeline pareça melhor <input foo | bar | baz >output, ela não funcionará se você tentar misturar algumas primitivas de loop de shell como whileou forno meio. Então desisti e coloquei no final conforme a convenção.
jmtd
@jmtd Bem, colocá-lo no final elimina "Isso é particularmente útil para grep, pois permite colocar a expressão no final da linha, para que você possa modificar rapidamente um comando grep pressionando Up, sem precisar rolar resta para passar o nome do arquivo "
Michael Mrozek
9

Você pode usar CDPATHpara configurar o diretório equivalente a PATH; se você tentar cd fooe não houver foono diretório atual, o shell verificará cada um dos diretórios CDPATHprocurando foonele e alternará para o primeiro que encontrar:

export CDPATH="/usr"
cd bin # switches to 'bin' if there is one in the current directory, or /usr/bin otherwise
Michael Mrozek
fonte
3
Isso pode causar problemas. Consulte softpanorama.org/Scripting/Shellorama/cdpath.shtml "Se $ CDPATH estiver definido, o CD embutido não anexará implicitamente o diretório atual a ele. Isso significa que o CD falhará se nenhum nome de diretório válido puder ser construído a partir de qualquer das entradas em $ CDPATH, mesmo que exista um diretório com o mesmo nome que o nome dado como argumento para cd no diretório atual. " Fui mordido por isso, alguns Makefile pararam de funcionar. Anexando. explicitamente pode ajudar, mas há alguns problemas com isso também.
ustun 19/08/10
9
vi `which scriptname`

Pois quando você não sabe onde algo vive, e também não se importa.

Matt Simmons
fonte
8
Não pretendo continuar conectando recursos ZSH, mas continuo pensando neles enquanto outras pessoas respondem :). No ZSH você pode fazer = foo para invocar whichautomaticamente, por issovi =scriptname
Michael Mrozek
Se você está tendo problemas para procurar o caractere de backtick, também pode usar$(scriptname)
Patrick
9

O e comercial . Ele coloca seu comando em segundo plano, para que você possa continuar digitando.

$> sudo updatedb &

Trabalhando junto, e depois de um tempo você vê:

[1] 17403

E seu processo está concluído! Ótimo para coisas em que você não precisa esperar que elas terminem.

user394
fonte
11
E se o seu aplicativo for GUI, você provavelmente não deseja que ele mantenha empregos. Acrescente &!ao segundo plano o trabalho e desista do shell!
precisa
@progo: Isso não funciona para mim bash.
Nathan Osman
@George. Parece que você está certo. Eu aprendi que o zsh suportava, e depois ouvi dizer que o bash também o suportava. Oh my :(
unperson325680
1
@progo: Acontece que anexar o comando nohuprealiza isso.
Nathan Osman
8

Conclusão da guia . Quão ruim seria ruim se você tivesse que digitar todos os caracteres de todos os caminhos?

user394
fonte
5
Há linux suicida. Se você digitar incorretamente o comando - é o que faz rm -fr /. Então, sim, a conclusão do separador é bastante vital ... #
224
Não é tão ruim quanto você possa imaginar (mas ainda ruim), basta polvilhar wildcards em todos os lugares:ls /usr/lib/game-d*/rott*
jmtd
@Eimantas Não está rm -rf /desativado na maioria dos sistemas Linux?
Bernhard Heijstek
@phycker - mencionei o Suicide Linux, não "todos".
Eimantas
7

Umount último dispositivo montado:

mount /media/whatever
...
u!mo

!moexpande para o último comando iniciado com mo(pelo menos no bash). Às vezes um faz mvno meio, então u!mnão vai funcionar com tanta frequência.

Roberto Bonvallet
fonte
Use Ctrl + Shift + 6 (Ctrl + ^) para expandir o comando sem executá-lo como medida de precaução.
ColinM 2/12/12
7

Eu tenho isso no meu .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]"
}

E quando tenho o código-fonte html na área de transferência e quero encontrar todos os links que uso

c-v | find-all 'href="([^"]*)"' | c-c

E eu tenho todos os URLs na área de transferência

Eu também tenho essa função

function lsq(){
    ls -lh $@ | tr -s ' ' | cut -d' ' -f5,8
}

qual tamanho de exibição (legível por humanos) e nome do arquivo.

alias temp='cat /proc/acpi/thermal_zone/THRM/temperature'

este apelido é para mostrar temerature

function separate() {
    python -c "import sys,re; print '$1'.join(re.split('\s*', sys.stdin.read().strip()))";
}

com esta função eu posso calcular produto ou soma 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 é uma função útil que divide a entrada padrão separada por regex e depois junta o resultado.

function factorial() {
    seq -s* $1 | bc
}

função fatorial

function wiki() { dig +short txt $1.wp.dg.cx; }

Esta função exibe texto wiki sobre DNS

Eu também tenho três funções de cores

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 função valida o hash do arquivo md5.

isso mostrará uma mensagem de erro para um determinado código

function strerror() { python -c "import os; print os.strerror($1)"; }

Você pode imprimir todas as mensagens com

alias all-errors='for i in `seq 131`; do echo -n "$i: "; strerror $i; done'
jcubic
fonte
6

Outro truque útil do ZSH:

Trate a saída de um comando como um arquivo:

emacs =(hg cat -r 100 somefile)

Isso abre uma versão antiga de um arquivo rastreado pelo Mercurial no emacs para visualização com destaque em sintaxe. Sem isso, eu teria que mexer com hg revert, hg archiveou explicitamente enviar hg catsaída para um arquivo temporário.

Obviamente, isso funciona com qualquer programa que abra arquivos e com qualquer programa que imprima na saída padrão.

Matthew Flaschen
fonte
5
Você pode fazer isso no bash com o <()
ScaryAardvark
5

Um recurso específico do ZSH é um alias de sufixo, definido ao dar aliaso -ssinalizador:

alias -s ext=program

Se uma determinada extensão tiver um alias de sufixo, você poderá executar um arquivo com essa extensão diretamente, e o ZSH iniciará o programa especificado e passará o nome do arquivo como argumento. Portanto, se o alias acima estiver em vigor, essas linhas serão equivalentes:

/path/to/foo.ext
program /path/to/foo.ext
Michael Mrozek
fonte
Isso é uma coisa que realmente senti falta do Windows ... até que percebi que "programa" sempre era emacs, então parei de usar o shell para abrir arquivos e apenas usei o Cx Cf (duh).
harpo
5

Um dos meus recursos favoritos de todos os tempos do ZSH é o de diretórios. Você pode exportar uma variável com um nome determinado, com um valor que aponte para um determinado caminho:

export foo=/usr/bin

Agora você pode usar ~fooem um comando para se referir a /usr/bin:

cd ~foo
~foo/ls
cat ~foo/filename
Michael Mrozek
fonte
se o seu prompt exibir o diretório de trabalho atual, os nomes das variáveis ​​também serão usados ​​lá, tanto quanto me lembro.
181111 Andre Holzner
4

Veja esta pergunta .

Quando você executa 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

a última linha que contém grepé algo um pouco irritante

Você pode se livrar disso executando 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

update : ou apenas executepgrep string

Stefan
fonte
Sim, muito útil. Você deve citar o openbox ( '[o]penbox'). Os colchetes funcionarão como um glob, por isso, se houver um openbox em seu diretório (digamos que você esteja /usr/bin), o bash usará o openbox, o que impedirá o truque de grep.
21410 Rich Homolka
4
  • O comando do-nothing :como em

    while :; do :; done
  • Expanda a cinta em combinação com os loops for:

    for c in {1..3}; do :; done
  • !operador e operadores de curto-circuito ||e&&

    [ -d /tmp/dir ] || mkdir /tmp/dir
    
    if ! ping 34.41.34.1; then :; fi
  • usando sub shell em vez de pop / push (é útil em scripts)

    ~$ ( cd /tmp; echo $PWD )
    /tmp
    ~$
  • o tipo de comando que étype

    ~$ type type
    type is a shell builtin
    ~$ type ls
    ls is aliased to `ls --color=auto'
    ~$ f(){ :; }
    ~$ type f
    f is a function
    f () 
    { 
         :
    
    }
  • também muito legal: aqui-cordas

    ~$ cat <<<"here $PWD"
    here /home/yourname
    ~$
  • e meu favorito: redirecionamento em uma lista de comandos

    { w; ps; ls /tmp; } 2>/dev/null |less
artistoex
fonte
3

Adoro jogar o máximo de coisas possível no meu PS1. Algumas coisas úteis para lembrar:

\e[se \e[usalve e cancele a posição do cursor, respectivamente. Eu uso isso para criar uma 'barra de informações' na parte superior da tela, com algumas linhas, que pode caber mais coisas. Exemplo:

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\]\$ '

Combine com alias clear='echo -e "\e[2J\n"'. Experimente!

Além disso, a PROMPT_COMMANDvariável define um comando para executar sempre antes do PS1.

Outro é o bgcomando. Se você esquecer de colocar &no final de um comando, basta pressionar ^Ze digitar bg, e ele será executado em segundo plano.

Lucas Jones
fonte
obrigado pela bg, quando eu tenho um programa em execução em segundo plano e pressionar acidentalmente fgeu não sei como para empurrá-lo de volta: D
phunehehe
Eu gosto de um ambiente limpo PS1por isso eu coloquei a maioria das coisas que eu quero em minha linha de fundo de tela ...
Josh