Qual é o seu truque de linha de comando mais favorito usando o Bash? [fechadas]

156

Todos sabemos como usar <ctrl>-R para reverter a pesquisa no histórico, mas você sabia que pode usar <ctrl>-Spara encaminhar a pesquisa, se você definir stty stop ""? Além disso, você já tentou executar o bind -p para ver todos os atalhos de teclado listados? Existem mais de 455 no Mac OS X por padrão.

Qual é o seu truque obscuro mais favorito, atalho de teclado ou configuração do shopt usando bash?

Robert Harvey
fonte
2
Por favor, reformule-o para dizer "Qual é o seu single mais favorito". Isso permite que as pessoas votem positivamente em respostas específicas, quase como uma enquete.
SCdF 16/09/08
> Por favor, reformule isso para dizer "Qual é o seu single mais favorito". Feito.
Martin Klinke 02/10/08
1
Há um clone StackOverflow por esta mesma pergunta: commandlinefu.com
rkb
Somente 232 dessas 455 associações de teclas padrão fazem algo diferente de "inserção automática" ("digite esta chave"): $ bind -p | grep -v inserção automática | wc
Ed Brannin 02/06/2009
Algumas coisas legais aqui. Mas deve ser notado que uma muito poucos deles só funcionam quando a festa está no modo de emacs ...
Mo.

Respostas:

157

Renomeando / movendo arquivos com sufixos rapidamente:
cp /home/foo/realllylongname.cpp{,-old}

Isso se expande para:
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old

user10765
fonte
12
Impressionante! Agora eu preciso tentar me lembrar deste.
21911 Jon Ericson
9
Apenas para salientar que fazer o inverso (indo de .cpp de idade para .cpp) que você faria cp /home/foo/realllylongname.cpp{-old,}
Michael Ekoka
Tão óbvio em retrospecto, e, no entanto, acho que não me lembraria de fazer isso sozinho. Obrigado!
Zecc
150
cd -

É o equivalente na linha de comando do botão Voltar (leva você ao diretório anterior em que você estava).

Mark Biek
fonte
6
Eu prefiro usar pushde popdmanter uma pilha de diretórios.
Alex M
21
Mas 'cd -' tem a vantagem de funcionar, mesmo que você não se lembre de usar pushd.
Sergio Acosta
10
Vale ressaltar que 'cd' leva você ao seu diretório pessoal.
dr-jan
É interessante que isso não apareça no ( man cdou cd --helppelo menos no meu).
Halil Özgür 22/02
135

Outro favorito:

!!

Repete o seu último comando. Mais útil no formato:

sudo !!
amrox
fonte
81
tem o benefício adicional de fazer você parecer realmente zangado com isso também. "Computador, faça isso." "Acesso negado". "FAÇA!!"
nickf
Isso não é pouco conhecido! :-)
hoyhoy 16/09/08
10
Coisas semelhantes que você pode fazer: mkdir testdir; cd !$.. Isto funciona cd [last word of previous line](no exemplo, cd testdir)
DBR
13
Faça-me um sanduíche sudo !!
Kibbee
Se você gosta de !!,! $ E! -1: ^ foo ^ bar, também irá "ligar Space: magic-space". stackoverflow.com/questions/603696/…
Ei
81

Meu favorito é '^ string ^ string2', que pega o último comando, substitui a string pela string2 e a executa

$ ehco foo bar baz
bash: ehco: command not found
$ ^ehco^echo
foo bar baz

Guia de histórico da linha de comando do Bash

seth
fonte
Isso não é ganancioso. Como faço para torná-lo ganancioso?
Altreus
9
!!:gs/ehco/echo/
Andre-R
A segunda página desse guia é essencial
jmoz
1
@ andre-r: !!:gs/ehco/echo/realiza uma pesquisa global e substitui o último comando (confira !!em stackoverflow.com/questions/68372/… ). Isso não é equivalente ao ^ehco^echoque apenas substitui uma instância de "ehco" - seria uma resposta mais precisa !!:s/ehco/scho.
Iceland_jack 30/07
64

renomear

Exemplo:

$ ls
this_has_text_to_find_1.txt
this_has_text_to_find_2.txt
this_has_text_to_find_3.txt
this_has_text_to_find_4.txt

$ rename 's/text_to_find/been_renamed/' *.txt
$ ls
this_has_been_renamed_1.txt
this_has_been_renamed_2.txt
this_has_been_renamed_3.txt
this_has_been_renamed_4.txt

Tão útil

Jiaaro
fonte
3
Uau, eu tenho sido um idiota todos esses anos usando basename, mv e {} truques para fazer isso. / foreheadsmack.
Gregg Lind
7
renomear não é específico do bash / readline, como os outros posts.
armas de
1
O zmv da distribuição zsh é muito melhor na maioria dos casos.
ZyX
O util-linux-ng também possui um comando de renomeação e não é como o mencionado nesta resposta. O comando descrito aqui é na verdade mmv .
Cristian Ciupitu
60

Eu sou um fã dos !$, !^e !*expandos, retornando, a partir da linha mais recente de comando apresentados: o último item, o item primeiro não-comando, e todos os itens não-comando. A saber (observe que o shell imprime o comando primeiro):

$ echo foo bar baz
foo bar baz
$ echo bang-dollar: !$ bang-hat: !^ bang-star: !*
echo bang-dollar: baz bang-hat: foo bang-star: foo bar baz
bang-dollar: baz bang-hat: foo bang-star: foo bar baz

Isto vem a calhar quando você, por exemplo ls filea fileb, e quer editar um deles: vi !$ou ambos: vimdiff !*. Também pode ser generalizado para o " nargumento th", assim:

$ echo foo bar baz
$ echo !:2
echo bar
bar

Por fim, com nomes de caminho, você pode acessar partes do caminho anexando :he :ta qualquer uma das expansões acima:

$ ls /usr/bin/id
/usr/bin/id
$ echo Head: !$:h  Tail: !$:t
echo Head: /usr/bin Tail: id
Head: /usr/bin Tail: id
Pi.
fonte
o 'eco !! 2' não funcionou para mim e de uma serra mais tarde post eu que eu acho que deveria ser: 'echo: 2'
user13060
8
adicione "bind Space: magic-space" a .bashrc e qualquer! A combinação será expandida automaticamente quando você atingir o espaço.
Yoo
47

Ao executar comandos, às vezes vou querer executar um comando com os argumentos anteriores. Para fazer isso, você pode usar este atalho:

$ mkdir /tmp/new
$ cd !!:*

Ocasionalmente, em vez de usar o find, separarei um loop de uma linha se precisar executar vários comandos em uma lista de arquivos.

for file in *.wav; do lame "$file" "$(basename "$file" .wav).mp3" ; done;

Configurar as opções do histórico da linha de comando no meu .bash_login (ou .bashrc) é realmente útil. A seguir, é apresentado um quadro de configurações que eu uso no meu Macbook Pro.

Definir o seguinte faz com que o bash apague comandos duplicados no seu histórico:

export HISTCONTROL="erasedups:ignoreboth"

Também elevo o tamanho da minha história bem alto também. Por que não? Parece não retardar nada nos microprocessadores atuais.

export HISTFILESIZE=500000
export HISTSIZE=100000

Outra coisa que faço é ignorar alguns comandos da minha história. Não há necessidade de lembrar o comando exit.

export HISTIGNORE="&:[ ]*:exit"

Você definitivamente deseja definir o histappend. Caso contrário, o bash substituirá seu histórico quando você sair.

shopt -s histappend

Outra opção que eu uso é o cmdhist. Isso permite salvar comandos de várias linhas no histórico como um comando.

shopt -s cmdhist

Por fim, no Mac OS X (se você não estiver usando o modo vi), convém redefinir <CTRL> -S para parar a rolagem. Isso impede que o bash possa interpretá-lo como pesquisa direta.

stty stop ""
hoyhoy
fonte
6
Eu encontro "Alt-". muito melhor que "!!: *" para repetir a última palavra do último comando.
Weidenrinde
Adições para o histroy: 1. salve o histórico regularmente (com -a se houver vários shells abertos ao mesmo tempo) exporte PROMPT_COMMAND = "history -a" 2. Alias ​​para ler o histórico de outros shells. alias - h = 'histórico -n; história grep '
Weidenrinde
exportar HISTIGNORE = "[] *" não é necessário, pois seu HISTCONTROL = ignoreboth deve fazer o mesmo
Weidenrinde
Outra coisa interessante da história: exportar HISTTIMEFORMAT = "% Y-% m-% d% H:% M:% S:"
Weidenrinde 17/09/08
Para salvar algumas teclas pressionadas em "cd !!: *", tente "cd! $". O "! $" Será interpretado como o último argumento do seu último comando.
Tim Stewart
43

Como listar apenas subdiretórios no atual?

ls -d */

É um truque simples, mas você não saberia quanto tempo eu precisava para encontrar esse!

edomaur
fonte
2
Excelente! Todos esses anos, o melhor que eu pude fazer foi alias lsd='ls -F | grep --color /', que listaria a mesma coisa, mas de uma maneira mais manca. No entanto, listaria um dir por linha, para facilitar a análise. I tiver modificado o seu comando para fazer o mesmo:ls -d1 */
Artem Russakovskii
Como é que isso funciona? "ls -d" lista apenas. (o que é estranho), mas "ls -d * /" funciona.
Yoo
1
É um pouco complicado ... "ls -d" é semelhante a "ls -d ./" e "ls -d /" a "ls -d ./*/". A opção '-d' define 'ls' tu listar apenas as entradas do diretório, mas se você não fornecer nenhum parâmetro, ele usará o diretório atual como parâmetro, portanto, terá * apenas o "." diretório para listar ...
edomaur
1
Não acredito que nunca descobri isso antes. Ótima dica.
Nick Dixon
Sem palavras, apenas uau !!! :)
dimba 10/09
41

ESC.

Insere os últimos argumentos do seu último comando bash. É mais útil do que você pensa.

cp file /to/some/long/path

CD ESC.

amrox
fonte
Isso funciona para mim (bash). Observe que você pressionou a tecla esc e depois a tecla do período. Sem hífen ou qualquer coisa.
Howler
9
Também alt-. É a mesma coisa.
Mark Baker
Sim, é apenas Bash. Mas <esc> (ou Alt- ou Meta-) _ está vinculado à mesma função, e <esc> -_ também funciona no modo vi também.
Nick Dixon
@ Hendry no meu zsh ele realmente funciona. Talvez você use o modo vi?
ZyX
Use a tag kbd para hits do teclado: <kbd> ESC </kbd> (mas não funciona muito bem junto com a formatação / indentação de código).
usuário desconhecido
36

Claro, você pode " diff file1.txt file2.txt", mas o Bash suporta a substituição de processos , o que permite diffa saída de comandos.

Por exemplo, digamos que eu queira ter certeza de que meu script me dê a saída que espero. Posso apenas envolver meu script em <() e alimentá-lo diffpara obter um teste de unidade rápido e sujo:

$ cat myscript.sh
#!/bin/sh
echo -e "one\nthree"
$
$ ./myscript.sh 
one
three
$
$ cat expected_output.txt
one
two
three
$
$ diff <(./myscript.sh) expected_output.txt
1a2
> two
$

Como outro exemplo, digamos que desejo verificar se dois servidores têm a mesma lista de RPMs instalados. Em vez de fazer o sshing para cada servidor, escrever cada lista de RPMs para separar arquivos e executar um diffdesses arquivos, eu posso fazer isso na diffminha estação de trabalho:

$ diff <(ssh server1 'rpm -qa | sort') <(ssh server2 'rpm -qa | sort')
241c240
< kernel-2.6.18-92.1.6.el5
---
> kernel-2.6.18-92.el5
317d315
< libsmi-0.4.5-2.el5
727,728d724
< wireshark-0.99.7-1.el5
< wireshark-gnome-0.99.7-1.el5
$

Há mais exemplos no Advanced Bash-Scripting Guide em http://tldp.org/LDP/abs/html/process-sub.html .

Philip Durbin
fonte
35

Meu comando favorito é "ls -thor"

Convoca o poder dos deuses para listar os arquivos modificados mais recentemente em um formato convenientemente legível.

user10109
fonte
6
Lembra-me de uma outra, totalmente inútil, mas também comando engraçado: ls -bart -simpson -ruls. S, ICNR
filiprem
'ls -tor' também é útil, pois você pode encontrar rapidamente arquivos grandes. E também, a grafia sueca original do nome do deus do trovão é na verdade 'Tor'.
Dala
Em dinamarquês, você pode usar ls -lorta palavra dinamarquesa para "merda". Omitindo nenhum grupo e não recebendo a ira de Valhal :)
Jesper Rønn-Jensen
1
pode-se também dizer que gosta "ls -lotr", que aparentemente tem algo a ver com Tolkien e O Senhor dos Anéis :)
Adepto
28

Mais uma novidade, mas é inteligente ...

Os 10 principais comandos usados:

$ history | awk '{print $2}' | awk 'BEGIN {FS="|"}{print $1}' | sort | uniq -c | sort -nr | head

Saída de amostra:

 242 git
  83 rake
  43 cd
  33 ss
  24 ls
  15 rsg
  11 cap
  10 dig
   9 ping
   3 vi
ctcherry
fonte
1
Aqui está uma versão mais curta e rápida:history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -nr | head
Pausado até novo aviso.
25

^ R pesquisa inversa. Pressione ^ R, digite um fragmento do comando anterior que você deseja corresponder e pressione ^ R até encontrar o que deseja. Não preciso me lembrar de comandos usados ​​recentemente que ainda estão no meu histórico. Não exclusivamente bash, mas também: ^ E para final de linha, ^ A para início de linha, ^ U e ^ K para excluir antes e depois do cursor, respectivamente.

user10741
fonte
2
Eu nunca me lembro ... por algum motivo. Também não existe um atalho de exclusão de exclusão de palavras?
hoyhoy
1
^ W exclui a palavra antes do cursor. (Sinta-se à vontade para editar sua resposta com isso.)
Jon Ericson
2
^ R sendo tão útil que foi mencionado na pergunta :)
Mark Baker
20

Muitas vezes tenho aliases para vi, ls, etc., mas às vezes você deseja escapar do alias. Basta adicionar uma barra invertida ao comando à frente:

Por exemplo:

$ alias vi=vim
$ # To escape the alias for vi:
$ \vi # This doesn't open VIM

Legal, não é?

Srikanth
fonte
Você também pode executar command- consulte SHELL BUILTIN COMMANDSo manual do Bash.
Iceland_jack
17

Aqui estão alguns ajustes na configuração:

~/.inputrc:

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

Isso funciona da mesma maneira que ^Rcom as teclas de seta. Isso significa que eu posso digitar (por exemplo) cd /media/e pressionar a seta para cima para ir para a última coisa que eu cdfaria dentro do/media/ pasta.

(Eu uso o Gnome Terminal, pode ser necessário alterar os códigos de escape para outros emuladores de terminal.)

A conclusão do Bash também é incrivelmente útil, mas é uma adição muito mais sutil. Em ~/.bashrc:

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

Isso permitirá o preenchimento de tabulação por programa (por exemplo, tentar concluir a tabulação quando a linha de comando iniciar com evince mostrará apenas arquivos que podem ser abertos, e também opções de linha de comando completas).

Funciona bem com isso também em ~/.inputrc:

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on
Porges
fonte
+1 bash_completion é impressionante
prestomation
Em um Mac, a pesquisa de histórico com teclas de seta pode ser ativada com: bind '"\ e [A"': histórico-pesquisa-para trás-bind '"\ e [B"': histórico-pesquisa-para frente
Asmus
17

Eu uso muito o seguinte:

O :pmodificador para imprimir um resultado do histórico. Por exemplo

!!:p

Irá imprimir o último comando para que você possa verificar se está correto antes de executá-lo novamente. Basta entrar!! para executá-lo.

Na mesma linha:

!?foo?:p

Pesquisará em seu histórico o comando mais recente que continha a string 'foo' e a imprimirá.

Se você não precisar imprimir,

!?foo

faz a pesquisa e a executa imediatamente.

Steve Lacey
fonte
2
Em vez de usar: p, você também pode usar o espaço mágico: stackoverflow.com/questions/603696/…
Yoo
expandir os controles históricos sem executar confiure magick-space no bashrcbind Space:magic-space # !pin<space>
SergioAraujo 11/11
16

Eu tenho uma arma secreta: shell-fu.

Existem milhares de dicas inteligentes, truques legais e receitas eficientes que na maioria das vezes cabem em uma única linha.

Um que eu amo (mas trapaceio um pouco desde que uso o fato de o Python estar instalado na maioria dos sistemas Unix agora):

alias webshare='python -m SimpleHTTPServer'

Agora, toda vez que você digitar "compartilhamento na web", o diretório atual estará disponível através da porta 8000. Muito bom quando você deseja compartilhar arquivos com amigos em uma rede local sem chave USB ou diretório remoto. O streaming de vídeo e música também funcionará.

E, claro, a clássica bomba de garfo que é completamente inútil, mas ainda muito divertida:

$ :(){ :|:& };:

Não tente isso em um servidor de produção ...

e-satis
fonte
Eu acho que não deveria webshare /
Yoo
Eu acho que você pode simplificar o comando para python -m SimpleHTTPServer(a menos que eu esteja sentindo falta de algo sofisticado que o comando original faz
Jesper Rønn-Jensen 28/05
Meh. Em um servidor de produção, esse fork bomb será esmagado pelo sistema operacional; existem limites para o número de processos que qualquer usuário pode criar.
Donal Fellows
3
@Donal: Você deve tentar e relatar suas descobertas.
Michael Foukarakis
12

Você pode usar o comando watch em conjunto com outro comando para procurar alterações. Um exemplo disso foi quando eu estava testando meu roteador e queria obter números atualizados sobre coisas como a relação sinal / ruído, etc.

watch --interval=10 lynx -dump http://dslrouter/stats.html
HFLW
fonte
O comando watch é muito legal. Eu li pela primeira vez no livro Linux Server Hacks cerca de cinco anos atrás. Quem sabia que existia?
hoyhoy 16/09/08
11
O que no mundo 'watch' tem a ver com bash?
Artem Russakovskii 04/08/09
11
type -a PROG

para encontrar todos os locais onde o PROG está disponível, geralmente em algum lugar em ~ / bin, em vez daquele em / usr / bin / PROG que poderia ser esperado.

dajobe
fonte
1
Também informará se é uma função ou um alias. Se estiver em vários lugares no seu PATH, mostrará cada um deles.
Pausado até novo aviso.
11

Eu gosto de construir comandos com eco e canalizá-los para o shell:

$ find dir -name \*~ | xargs echo rm
...
$ find dir -name \*~ | xargs echo rm | ksh -s

Por quê? Porque me permite ver o que será feito antes de fazê-lo. Dessa forma, se eu tiver um erro horrível (como remover meu diretório inicial), posso detectá-lo antes que aconteça. Obviamente, isso é mais importante para ações destrutivas ou irrevogáveis.

Jon Ericson
fonte
1
Convém usar find -print0 e xargs -0 para evitar problemas com arquivos e pastas com espaços em branco.
Neu242 22/09/08
Ou evite criar e trabalhar com arquivos e pastas com espaços em branco em seus nomes. ;-) Obviamente, se você estiver trabalhando com nomes gerados pelo usuário, sua sugestão é vital.
Jon Ericson
4
Por que você acrescentaria "| ksh -s" quando você poderia remover o "eco"?
Yoo
Não há necessidade de canalizar com o GNU find:$ find dir -name \\*~ -exec rm {} +
bobbogo
10

Ao baixar um arquivo grande, geralmente faço:

while ls -la <filename>; do sleep 5; done

E então, basta pressionar Ctrl + c quando terminar (ou se lsretornar diferente de zero). É semelhante ao watchprograma, mas usa o shell, portanto, funciona em plataformas semwatch .

Outra ferramenta útil é o netcat, ou nc. Se você fizer:

nc -l -p 9100 > printjob.prn

Em seguida, você pode configurar uma impressora em outro computador, mas usar o endereço IP do computador que está executando o netcat. Quando o trabalho de impressão é enviado, é recebido pelo computador que está executando o netcat e despejado printjob.prn.

dreamlax
fonte
Por que isso e não, por exemplo wget?
porges 16/09/08
Tente watch ls -la <filename>(use -n5 se você não gostar do padrão de 2 segundos).
Ted Percival
1
O @Ted, no entanto, watchnão está disponível em todas as plataformas, como Solaris, Mac OS X, etc. @Porges, não sei o que você quer dizer. O wget também pode ouvir em uma porta?
dreamlax 16/09/08
10

pushde popdquase sempre são úteis

jdt141
fonte
10

Uma maneira preferida de navegar quando estou usando vários diretórios em locais amplamente separados em uma hierarquia de árvore é usar o acf_func.sh (listado abaixo). Uma vez definido, você pode fazer

cd -

para ver uma lista de diretórios recentes, com um menu numérico

cd -2

para ir para o segundo diretório mais recente.

Muito fácil de usar, muito útil.

Aqui está o código:

# do ". acd_func.sh"
# acd_func 1.0.5, 10-nov-2004
# petar marinov, http:/geocities.com/h2428, this is public domain

cd_func ()
{
  local x2 the_new_dir adir index
  local -i cnt

  if [[ $1 ==  "--" ]]; then
    dirs -v
    return 0
  fi

  the_new_dir=$1
  [[ -z $1 ]] && the_new_dir=$HOME

  if [[ ${the_new_dir:0:1} == '-' ]]; then
    #
    # Extract dir N from dirs
    index=${the_new_dir:1}
    [[ -z $index ]] && index=1
    adir=$(dirs +$index)
    [[ -z $adir ]] && return 1
    the_new_dir=$adir
  fi

  #
  # '~' has to be substituted by ${HOME}
  [[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}"

  #
  # Now change to the new dir and add to the top of the stack
  pushd "${the_new_dir}" > /dev/null
  [[ $? -ne 0 ]] && return 1
  the_new_dir=$(pwd)

  #
  # Trim down everything beyond 11th entry
  popd -n +11 2>/dev/null 1>/dev/null

  #
  # Remove any other occurence of this dir, skipping the top of the stack
  for ((cnt=1; cnt <= 10; cnt++)); do
    x2=$(dirs +${cnt} 2>/dev/null)
    [[ $? -ne 0 ]] && return 0
    [[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}"
    if [[ "${x2}" == "${the_new_dir}" ]]; then
      popd -n +$cnt 2>/dev/null 1>/dev/null
      cnt=cnt-1
    fi
  done

  return 0
}

alias cd=cd_func

if [[ $BASH_VERSION > "2.05a" ]]; then
  # ctrl+w shows the menu
  bind -x "\"\C-w\":cd_func -- ;"
fi
Leonard
fonte
10

Expanda linhas complicadas antes de pressionar o temido enter

  • Alt+ Ctrl+ e- shell-expandir-line (pode precisar usar Esc, Ctrl+e no teclado)
  • Ctrl+ _- desfazer
  • Ctrl+ x, *- palavra de expansão glob

$ echo !$ !-2^ * Alt+ Ctrl+ e
$ echo aword someotherword * Ctrl+ _
$ echo !$ !-2^ * Ctrl+ x, *
$echo !$ !-2^ LOG Makefile bar.c foo.h

& c.

bobbogo
fonte
+1, estou sempre com medo de pressionar Enter:)
João Portela
Não conhecia nada disso. Desfazer é um assassino. Bom para qualquer edição de linha de comando.
Philippe A.
9

Eu sempre fui parcial em:

ctrl-E # move cursor to end of line
ctrl-A # move cursor to beginning of line

Eu também uso shopt -s cdable_vars, então você pode criar variáveis ​​bash para diretórios comuns. Portanto, para a árvore de fontes da minha empresa, crio várias variáveis ​​como:

export Dcentmain="/var/localdata/p4ws/centaur/main/apps/core"

então eu posso mudar para esse diretório por cd Dcentmain.

Drew Frezell
fonte
Casa e Fim fazem as mesmas coisas que crtl-A e ctrl-E.
Davidfg4 15/04/09
Isso ajuda em laptops Mac que não possuem chaves domésticas e finais.
jamesh
Infelizmente, ctrl-A também é a tecla de escape, screenpor padrão. Eu remapeá-lo para ctrl-X no meu .screenrc, mas não sou um usuário do emacs.
system PAUSE
Um pouco relacionado à opção cdable_vars, também há a variável de ambiente CDPATH. Mas isso funciona de maneira diferente, porque você define o diretório pai, como no PATH. Com cdable_vars você obtém mais controle.
Zecc
1
Mais para sua lista de atalhos: CTRL + K para excluir tudo do cursor até o final da linha, CTRL + U para excluir tudo antes do cursor, ALT + F / ALT + B para mover uma palavra para frente / trás (ou CTRL + seta esquerda / CTRL + seta para a direita). +1 para cdable_vars!
Philippe A.
8

pbcopy

Isso copia para a área de transferência do sistema Mac. Você pode canalizar comandos para ele ... tente:

pwd | pbcopy

Max Masnick
fonte
NB! Este é um comando específico do Mac.
dala 17/05
Estes não são: alias pbcopy='xsel --clipboard --input' e alias pbpaste='xsel --clipboard --output'
wawawawa 18/10/11
7
$ touch {1,2}.txt
$ ls [12].txt
1.txt  2.txt
$ rm !:1
rm [12].txt
$ history | tail -10
...
10007  touch {1,2}.txt
...
$ !10007
touch {1,2}.txt
$ for f in *.txt; do mv $f ${f/txt/doc}; done
Allan Wind
fonte
Use em history 10vez de history | tail -10(que deve ser tail -n 10o caminho desde que essa sintaxe foi descontinuada).
Pausado até novo aviso.
7

O uso de 'set -o vi' na linha de comando, ou melhor, em .bashrc, coloca você no modo de edição vi na linha de comando. Você inicia no modo 'inserir' para digitar e retroceder normalmente, mas se cometer um erro 'grande', poderá pressionar a tecla esc e, em seguida, usar 'b' e 'f' para se movimentar como no vi. cw para mudar uma palavra. Particularmente útil depois que você abre um comando de histórico que deseja alterar.

Leonard
fonte
7

Semelhante a muitos acima, meu favorito atual é o pressionamento de tecla [alt]. (Alt e "." Juntas) são o mesmo que $! (Insere o último argumento do comando anterior), exceto que é imediato e para mim é mais fácil digitar. (Apenas não pode ser usado em scripts)

por exemplo:

mkdir -p /tmp/test/blah/oops/something
cd [alt].
user11535
fonte
Tente também combiná-lo com Alt- [0-9] (pressione a primeira combinação, solte e depois a segunda). por exemplo, se o último comando foi 'mv foo bar', então "Alt-0 Alt-". dá 'mv', "Alt-1 Alt-". dá 'foo', "Alt-2 Alt-". e Alt- básico. ambos dão 'bar', etc.
Sam Stokes
1
Tente também pressionar Alt-. mais de uma vez (ou pressione Alt, mantenha-o pressionado, pressione ponto várias vezes e solte Alt). É semelhante a pressionar Ctrl-R mais de uma vez.
Yoo
7

Coloque vários comandos juntos usando o comando && :

./run.sh && tail -f log.txt

ou

kill -9 1111 && ./start.sh
Tchen
fonte
1
se um falhar, o outro comando não vai ser executado (falhar rápido, como na programação)
Frederic Morin
1
O oposto é usar o lógico ou '||' em que o lado direito só será executado se o lado esquerdo for falso. Exemplo: <code> command_1 || command_2 </code>
dala