Respostas:
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).
history
comando mostrará uma lista de comandos executados recentemente com um designador de eventos à esquerda!N
substituirá o comando associado ao designador de evento N
!-N
substituirá o N
th comando mais recente; por exemplo !-1
, substituirá o comando mais recente, !-2
o segundo mais recente etc.!!
é 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!:1
receberá o primeiro argumento (e !:2
o 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 baset
- Apenas o nome do arquivo baser
- Alinhar até a extensão do nome do arquivoe
- Apenas a extensão do nome do arquivos/search/replacement
- Substitua a primeira ocorrência de search
porreplacement
gs/search/replacement
- Substitua todas as ocorrências de search
porreplacement
!-#
também. Eu uso !string
para 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
!N
executará o comando ..." é uma descrição muito estreita; na verdade, !N
será 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 !!
.
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 eshell
no Emacs). Então muitas vezes eu estrago tudo.
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.
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.
yank-last-arg
comando readline, portanto, ele deve funcionar com qualquer programa vinculado à readline, não apenas BASH ou ZSH.
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
ascii
programa separado também é útil. Além de imprimir uma tabela, permite consultar um ou mais caracteres individuais.
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+L
corresponde 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.
Ctrl+W
cortar uma palavra para trás, Alt+F
avançar uma palavra, Alt+B
avançar uma palavra em uma linha. Eu gosto Ctrl+Y
e Shift+Insert
porque 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
).
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!
alias mk=make
Mais rápido para digitar e menos propenso a errar. Ou compile a partir do seu editor usando uma tecla de atalho ...
alias m=make
, ou mesmo m=make -j6
ou similar - só que eu já usam alias m=mutt
☺
Bastante básico, mas as pessoas parecem não saber, retorna ao diretório anterior:
cd -
cd..
a partir do DOS está entranhado na minha memória muscular ...
cd
(sem argumento) que leva você ao seu diretório pessoal.
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
foo[123]
que irá expandir-se para foo1 foo2 foo3
, mas eles precisam ser nomes de arquivos para trabalhar nesse caso
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:
mkdir
e cd
nele:
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
}
mkcd
apenas 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" }
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
}
builtin foo
para ter uma função definida cd
; Eu tenho usado chdir
em minhas funções. Handy
cd() { builtin cd -- "$@" && { [ "$PS1" = "" ] || ls -hrt --color; }; }
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.
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
u
e o
representa aqui?
setopt autopushd
e todas as alterações de diretório serão enviadas automaticamente
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.
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
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'
s/fast/sloppy/
reset
onde você usa restaura
.
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
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
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'
<input foo | bar | baz >output
, ela não funcionará se você tentar misturar algumas primitivas de loop de shell como while
ou for
no meio. Então desisti e coloquei no final conforme a convenção.
Você pode usar CDPATH
para configurar o diretório equivalente a PATH
; se você tentar cd foo
e não houver foo
no diretório atual, o shell verificará cada um dos diretórios CDPATH
procurando foo
nele 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
vi `which scriptname`
Pois quando você não sabe onde algo vive, e também não se importa.
which
automaticamente, por issovi =scriptname
$(scriptname)
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.
&!
ao segundo plano o trabalho e desista do shell!
bash
.
nohup
realiza isso.
Conclusão da guia . Quão ruim seria ruim se você tivesse que digitar todos os caracteres de todos os caminhos?
rm -fr /
. Então, sim, a conclusão do separador é bastante vital ... #
ls /usr/lib/game-d*/rott*
rm -rf /
desativado na maioria dos sistemas Linux?
Umount último dispositivo montado:
mount /media/whatever
...
u!mo
!mo
expande para o último comando iniciado com mo
(pelo menos no bash). Às vezes um faz mv
no meio, então u!m
não vai funcionar com tanta frequência.
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'
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 archive
ou explicitamente enviar hg cat
saí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.
Um recurso específico do ZSH é um alias de sufixo, definido ao dar alias
o -s
sinalizador:
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
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 ~foo
em um comando para se referir a /usr/bin
:
cd ~foo
~foo/ls
cat ~foo/filename
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
'[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.
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
Adoro jogar o máximo de coisas possível no meu PS1. Algumas coisas úteis para lembrar:
\e[s
e \e[u
salve 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_COMMAND
variável define um comando para executar sempre antes do PS1.
Outro é o bg
comando. Se você esquecer de colocar &
no final de um comando, basta pressionar ^Ze digitar bg
, e ele será executado em segundo plano.
bg
, quando eu tenho um programa em execução em segundo plano e pressionar acidentalmente fg
eu não sei como para empurrá-lo de volta: D
PS1
por isso eu coloquei a maioria das coisas que eu quero em minha linha de fundo de tela ...