Práticas recomendadas e dicas da linha de comando do Linux?

112

Gostaria de abrir uma discussão que acumularia as melhores práticas e dicas da linha de comando do Linux (CLI).

Eu procurei por essa discussão para compartilhar o comentário abaixo, mas não encontrei um, portanto, este post.

Espero que todos possamos aprender com isso.

Você pode compartilhar suas dicas do Bash, grep, sed, AWK, / proc e todas as outras administrações relacionadas ao sistema Linux / Unix, melhores práticas de programação de shell para o benefício de todos nós.

Maxim Veksler
fonte
Por que apenas o Linux? Muitas dicas podem ser úteis em quase todos os sabores do Unix.
Mouviciel 02/03/09
Esta questão pode ser um pouco ampla - não é suficiente para as melhores práticas de linha de comando Linux / Unix para encher livros inteiros ...
Jonik
Eu concordo que as dicas do unix que podem ser aplicadas ao linux também são muito bem-vindas, eu escrevi o linux porque A. É com isso que trabalhamos aqui. B. porque está ganhando uma exposição pública mais ampla do que o unix nos últimos anos.
Maxim Veksler
Eu acho que é uma ótima idéia completar uma lista dos comandos mais úteis e interessantes que as pessoas usam.
Algum destes é relevante? refspecs.freestandards.org

Respostas:

111

Use screen , um multiplexador de terminal gratuito desenvolvido pelo Projeto GNU que permitirá que você tenha vários terminais em um.

Você pode iniciar uma sessão e seus terminais serão salvos mesmo quando a conexão for perdida, para que você possa retomar mais tarde ou em casa.

jeneriz
fonte
2
As opções mais comuns que utilizo são 'screen -D -R' para desanexar e retomar minha última sessão de tela e 'screen -x' para visualizar a mesma sessão de tela a partir de vários logins. Além disso, obter-se um bom .screenrc de dotfiles.org/.screenrc
Nick Devereaux
4
Outra coisa legal sobre tela é que você pode compartilhar um terminal com outras pessoas quando você quer colaborar em alguma coisa, usando -x tela
gareth_bowles
101

SSH!
SSH é o comando divino - acho que é o comando geral mais valioso para aprender. As opções podem ser bastante assustadoras, mas parece que estou constantemente aprendendo a usar novas opções de linha de comando para SSH que nunca pensei que fossem necessárias. Eu posso ter usado todos eles neste momento.

Quanto mais você o usa, mais aprende. Você pode usá-lo para fazer algumas coisas INCRÍVEIS.

Nota: TODAS essas coisas são executáveis ​​remotamente, sem configuração no servidor, exceto pelo fato de o servidor ssh estar em execução.

Montar um sistema de arquivos pela Internet

pesquise na rede por SSHFS

Comandos de encaminhamento .

O protocolo SVN + SSH é o Subversion de um cliente remoto para um servidor sem NO DEAMON em execução! O comando SVN inicia o servidor através do shell ssh e passa as informações para frente e para trás através do canal existente. O programa rsync faz a mesma coisa, é executado em um servidor sem rsync deamon iniciando um via SSH. É fácil escrever seus próprios arquivos bash para fazer truques semelhantes.

Cadeia para atravessar firewalls

Eu uso isso o tempo todo para passar pelo meu servidor linux em casa para o meu mac.

Portas de encaminhamento:
parece apenas moderadamente útil até você perceber que pode saltar através do firewall doméstico e configurar seu roteador em casa do trabalho como se estivesse fazendo isso de dentro da sua rede doméstica).

Encaminhar solicitações X:

Este é outro incrível. Com ou sem um servidor X em execução no seu sistema remoto, você pode executar um programa x-windows e a janela aparecerá na tela local. Basta usar o interruptor -X, isso é tudo!

Como você não precisa ter um servidor X em execução no servidor remoto, o impacto da CPU no servidor é mínimo, você pode ter um servidor TINY Linux que oferece aplicativos enormes para o seu poderoso PC de jogo executando Windows e cygwin / X.

É claro que o VI e o EMACS funcionam com SSH, mas quando estou em casa, às vezes quero mais. Eu uso o ssh -X para iniciar uma cópia do Eclipse! Se o seu servidor é mais poderoso que o seu laptop, você tem a GUI bem ali, mas as compilações são feitas no servidor, portanto, não se preocupe com a carga do sistema.

Executar em arquivos em lote

(ou seja, execute um arquivo em lote local que "faça coisas" em outros sistemas):

Duas coisas se combinam para deixar este legal. Uma é que você pode eliminar as solicitações de senha usando chaves de criptografia (mais seguras). A segunda é que você pode especificar um comando na CLI SSH. Eu usei isso de algumas maneiras interessantes - como quando uma compilação falha no servidor remoto, eu colocava o SSH no meu computador e reproduzia um arquivo de som).

Lembre-se de que você pode redirecionar a saída do comando remoto e usá-la no seu arquivo em lote local, para que você também possa executar localmente uma compilação em execução no servidor.

Incorporado ao Mac

O servidor e o cliente são incorporados no mac e no linux. No caso do Mac e do Ubuntu, ativar um servidor é tão simples quanto encontrar a caixa de seleção correta.

Em um PC, instale o cygwin ou cygwin / X (o cygwin / X permitirá que você encaminhe sua saída x-window da sua máquina Linux para o seu PC com Windows - ele instala um servidor X)

Dicas importantes / arquivo de configuração

Nunca use a porta 22 no seu firewall. Você terá várias tentativas de invasão, mas não vale a pena. Apenas faça com que o firewall encaminhe uma porta diferente para o servidor.

Existem amplas opções de configuração que permitem simplificar significativamente seus comandos ssh. Aqui está um exemplo meu no trabalho:

Host home
    hostname billshome.hopto.org
    Port=12345
    user=bill
    LocalForward=localhost:1025 mac:22

Quando digito "ssh home" (nada mais), ele age como se eu tivesse digitado:

ssh -p 12345 bill@billshome.hopto.org

e depois encaminha minha porta local 1025 para o meu sistema "mac" em casa. A razão para isso é que tenho outra entrada no meu arquivo:

Host mac
    hostname localhost
    port=1025

para que, depois de criar uma "ssh home" e ainda ter a janela aberta, eu possa digitar "ssh mac" e o computador em funcionamento aqui tente conectar-se à sua própria porta 1025 que foi encaminhada para "mac: 22 "pelo outro comando, para que ele se conecte ao meu Mac em casa através do firewall.

Editar - script legal!

Desenterrei um script antigo que adoro - tive que voltar e publicá-lo para qualquer pessoa aqui que pudesse estar interessada. O script é chamado "authMe"

#!/bin/bash
if [ ! -f ~/.ssh/id_dsa.pub ]
then
    echo 'id_dsa.pub does not exist, creating'
    ssh-keygen -tdsa
fi
ssh $1 'cat >>.ssh/authorized_keys' <~/.ssh/id_dsa.pub

Se você possui esse script no diretório inicial e existe um host ao qual você pode se conectar (via ssh), digite "./authMe hostName".

Se necessário, ele criará um par de chaves público / privado para você, em seguida, transferirá o ssh para a outra máquina e copiará sua chave pública (o comando ssh solicitará uma senha ...)

Depois disso, o comando SSH não deve mais solicitar sua senha ao se conectar ao sistema remoto, ele usará o par de chaves pública / privada.

Se o seu computador remoto nem sempre estiver seguro, considere definir uma "senha" quando solicitado.

Você também pode configurar o servidor ssh na extremidade oposta para não permitir senhas de texto (apenas chaves) para segurança adicional.

Bill K
fonte
4
+1 publicação muito agradável e compacta #
Karsten
2
Uma pequena observação sobre o SSH na porta 22: desde que você tenha uma boa senha root e seus usuários não tenham senhas terríveis, basta executar fail2ban (ou algo semelhante) para impedir tentativas de crack. Achei muito chato manter o SSH em outra porta.
David Wolever 13/09/09
1
Às vezes, pode ser irritante, mas o volume de conexões era assustador. Eu sei que eles não devem passar, mas é como se você tivesse alguém andando até sua casa e mexendo na maçaneta a cada minuto - apenas enervante.
Existe uma versão embutida do seu último comando na maioria das versões do ssh hoje em dia, é chamada ssh-copy-ide é tão simples quantossh-copy-id user@someserver
JamesHannah 20/09/09
Outra maneira de executar seu truque 'ssh mac' é usar uma diretiva ProxyCommand no seu arquivo .ssh / config. Host Mac ProxyCommand ssh -q home "nc% h% p" Isso executará o netcat (nc) em casa e redirecionará sua conexão ssh diretamente para o mac. Acho mais fácil aqueles a cadeia (por exemplo, se você precisa se conectar a 'casa' para chegar ao 'bastião de trabalho' para chegar ao 'servidor web trabalho'.
toppledwagon
73

Eu gosto de usar

cd -

para mudar para o diretório anterior. Muito útil!

Fortyrunner
fonte
6
Eu nunca soube disso! Obrigado! Em uma nota relacionada, pushd e popd fazem algo semelhante, construindo uma pilha de diretórios. Esse tipo de truque ajuda quando você está navegando em uma estrutura profunda de diretório.
Isto é pura iluminação.
Manuel Ferreria
69

Descobri recentemente o pvcomando (visualizador de tubos) que é como gato, mas com detalhes de transferência.

Então, ao invés de

$ gzip -c access.log > access.log.gz

Você pode usar

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

Então, em vez de não fazer idéia de quando sua operação será concluída, agora você saberá!

Cortesia de Peteris Krumins

Nick Devereaux
fonte
$ Gzip -c access.log> access.log.gz Porque não basta: $ gzip access.log
Oh, isso funciona :) Acabei de pegar o exemplo do site de Peteris.
Nick Devereaux
Parece bom velho tee(1).
Daniel C. Sobral
Utilitário extremamente útil, que eu sempre esquecer :-(
Patrick
53
sudo !!

Execute novamente o comando anterior como root.

[O comando superior atual no site http://www.commandlinefu.com , um site com o tema desta pergunta.]

codeinthehole
fonte
2
Divulgação - Eu corro commandlinefu.com
codeinthehole
9
Teria salvado esse cara com 16 caracteres: xkcd.com/149
46

Pressione Ctrl-R e comece a digitar um comando (ou qualquer parte dele) - ele pesquisa o histórico de comandos. Pressionar Ctrl-R novamente pulará para a próxima partida, enter executa o comando atualmente exibido e a seta para a direita (pelo menos) permitirá que você o edite primeiro.

$ (reverse-i-search)`svn': svn status

Eu tinha usado o Linux por algo como 7 anos como meu sistema operacional principal antes de aprender isso, mas agora que eu o conheço, é bastante útil.

Jonik
fonte
Obrigado. Eu tenho usado a pesquisa reversa, mas não consegui descobrir como pular para a próxima partida.
Adam
Ctrl-S pula para a próxima partida. Pode ser necessário stty -ixonprimeiro desativar o significado de controle de fluxo XON / XOFF (isso também disponibiliza Ctrl-Q, por padrão, ele é mapeado para ser o mesmo que inserção com aspas Ctrl-V, mas você pode alterá-lo para outra coisa ) Veja man sttye man readlinepara mais informações. O sttycomando pode ser adicionado ao seu~/.bashrc
Dennis Williamson
45

A linha de comando é uma coisa engraçada. Eu acho que você só pode aprender muito sozinho e o resto, por acidente, assistindo alguém usando uma linha de comando.

Eu estava usando o shell há anos digitando meticulosamente os nomes dos diretórios manualmente. Um dia, eu estava assistindo um amigo mexer no sistema e ele continuou pressionando a tecla Tab. Eu perguntei "por que você está acessando a guia?". Resposta: tenta completar o diretório ou o nome do arquivo. Quem teria adivinhado - conclusão da guia! Digite um pouco do arquivo ou diretório, pressione a tecla Tab e ele tentará finalizar o que você digitou (o comportamento depende de qual shell).

Um dia, esse amigo estava me observando na linha de comando e me viu digitar algo como:

coryking@cory ~/trunk/mozi $ pushd /etc
/etc ~/trunk/mozi
coryking@cory /etc $ popd
~/trunk/mozi
coryking@cory ~/trunk/mozi $

Quem teria adivinhado !? Ele nunca soube sobre popd/ pushd. Acho que estamos quites ...

Cory R. King
fonte
1
Para mim, a conclusão da guia parece algo "óbvio", muito básico, mas também nunca soube sobre popd / pushd. Engraçado mesmo. :)
Jonik
3
Veja também esta resposta para ser capaz de tab-completar muito mais do que comandos, arquivos e diretórios: stackoverflow.com/questions/603696//603919#603919
Jonik
1
Isso é verdade. Aprendi sobre a pesquisa de histórico reverso do bash (ctrl-r) assistindo alguém. Mais tarde, percebi que era um recurso readline e funcionou da mesma forma em outros programas que incorporam readline (mysql, gdb, python -i, clisp etc.).
sigjuice
2
Como você pode usar o "shell" por anos e não saber sobre o preenchimento de guias?
Prestomation 18/12/2009
Ao lidar com pushd / popd, não se esqueça de mencionar os comandos dirs . Ele mostra o que está na pilha pushd / popd.
slm 30/07
41

Aprenda o Vim.

É (sem dúvida) o melhor editor, mas certamente o melhor editor disponível em um servidor Linux.

Ali A
fonte
1
gvim é também o melhor navegador de arquivos no Windows;)
Isso também é extremamente útil, uma vez que você conhece o vim, pode colocar a maioria dos shells no modo vi, e a navegação se torna extremamente fácil e rápida
Patrick
38

Às vezes, é útil deixar um programa em execução mesmo após o logout. Eu já vi algumas soluções que usam nohup ou até tela para esse fim. O mais simples que conheço é:

$ your_command_here & disown

Você também pode desanexar um programa em execução:

$ your_command_here
# Press <Control-Z> to stop the program and bring it to background:
$ bg
$ disown
kyku
fonte
6
O uso da tela é excelente porque você pode "reconectar" a esse aplicativo a partir de qualquer lugar mais tarde.
Prestomation 02/03/09
+1, eu não tinha ouvido falar em desdém.
user18911
idem re renegar, embora eu já fazer o mesmo com a tela
Andy
38

Quando quero ter certeza de que uso o comando real e não um alias, uso uma barra invertida à esquerda:

\rm -rf ~/tmp
mouviciel
fonte
é o mesmo que "comando rm -rf ~ / tmp"?
Maxim Veksler
Eu não sabia "comando", mas parece o mesmo.
Mouviciel 02/03/09
4
Bem, sim, a menos que o "comando" não é alias no caso em que você teria que usar \ comando rm -rf ~ / tmp nesse caso \ rm -rf ~ / tmp é melhor
Jamol
@presario e você acha que seria possível criar um apelido para "/"? Que pena eu não posso upvote os comentários :)
Veja também o comando semelhante " builtin".
Dennis Williamson
38

Esta dica deixará sua CLI mais confortável (pelo menos para mim):

crie o arquivo ~ / .inputrc com o seguinte conteúdo:

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

Recarregue o bash (por exemplo, digitando "exec bash"). Quando você digita o prefixo de um comando e pressiona a seta para cima, você navega pelos comandos que começam com o seu prefixo; por exemplo, se você digitou ssh, ele mostra suas conexões anteriores com shells remotos. Se o seu prompt estiver vazio, a seta para cima navegará no histórico da maneira normal.

kyku
fonte
3
Normalmente, eu os vinculo a \ e [5 ~ e \ e [6 ~ (aka pageup e pagedown) em vez de rebobinar as setas, mas é mais conveniente que Ctrl-R / Ctrl-S :)
ephemient
+1. Eu tenho esses vinculados ao F8 e Shift-F8 para imitar o cmd.exe, mas o mesmo princípio se aplica.
user18911
4
+1 paraexec bash
Dennis Williamson
É também educativa para ler man readlinee memorizá-lo de atalhos padrão
SaveTheRbtz
Você também pode bind -f ~/.inputrcrecarregar o inputrc sem precisar iniciar um novo bash e acabar com o seu ambiente atual.
Patrick
36

Use em &&vez de ;executar vários comandos ao mesmo tempo. Para quando ocorre um erro e não executa os outros comandos.

Exemplo clássico:

./configure && make && make install
x-way
fonte
1
Esta prática é tão subestimada! Deve ser uma prática padrão finalizar cada linha de um script de shell com && e usar "true" como o comando final.
user18911
3
o engraçado é que eu não sabia sobre o ';' comando antes - eu sempre usei '&&'.
Nick Klauer 15/03/09
4
Você pode iniciar scripts shell com "#! / Bin / sh -e". Isso para se alguma linha falhar.
stribika
3
Você pode usar um cano duplo para a cláusula "else":dosomething && echo "success" || echo "teh fail"
Dennis Williamson
2
Houve uma observação recente no Planet Debian que é uma prática ruim usar o -e na linha shebang. Em vez disso, use set -e no corpo do script. Dessa forma, o script não funcionará de maneira diferente se alguém executar usando sh $ filename.
Ptman
32

Ao escrever loops na linha de comando no bash, prefixo comandos arriscados com o comando 'eco'.

for item in items; do echo something-risky; done

Dessa forma, eu consigo ver o 'algo arriscado' na íntegra antes de me comprometer a executá-lo. Ajuda quando seu comando arriscado inclui expansões e globs variáveis. E 'set -x' é muito útil ao escrever scripts bash.

'set -x' permite a depuração. Consulte http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html para obter informações sobre a depuração do bash.

Jonathon Watney
fonte
3
Eu também faço isso, truque muito útil!
user18911
1
+1 Isso pode salvar vidas! ou dados saver ...
David Oneill
31

Requerimento

Você precisa testar a largura de banda máxima entre 2 servidores.


Solução

No SERVER1, faça:

nc -u -l 54321 > /dev/null

No SERVER2, faça:

dd if=/dev/zero bs=1MB | nc -u SERVER1 54321 &
pid=$(pidof dd)
while (( 1 )); do kill -USR1 $pid; sleep 2; done

Você verá resultados como:

182682000000 bytes (183 GB) copied, 1555.74 seconds, 117 MB/s
182920+0 records in
182919+0 records out

117 MB / s é o fator interessante aqui, que mostra a largura de banda real de transferência de rede.

Explicação :

Como o pacote começará a fluir pela rede, você poderá ver as estatísticas de largura de banda no SERVER2, que é uma estimativa muito boa da largura de banda máxima possível real entre os 2 servidores.

Cópia por UDP (para evitar sobrecarga de TCP).

Copiar da memória (/ dev / zero) no SERVER1 para a memória (/ dev / null) no SERVER2, impedindo, assim, a E / S do disco de se tornar um gargalo.

Maxim Veksler
fonte
4
Certifique-se de que o ssh não esteja configurado para usar a compactação em .ssh / config ''. Caso contrário, você vai ter números realmente agradáveis que são muito longe da verdade ;-)
Joachim Sauer
Hahaha sim. E o SSH vai bater na criptografia e descriptografia da CPU, o que também prejudicará os números.
use netcat em vez disso
bendin 03/03/2009
+1 para netcat. a sobrecarga de SSH irá distorcer os números
Mikeage
Refatorado para alterar as sugestões de @saua, @Daniel Von Fange e @bendin. Obrigado por suas sugestões pessoal.
Maxim Veksler
23

Ver estruturas de diretório de cores é mais fácil.

alias ls="ls --color=tty"

Editar

alias ls="ls --color=auto"
Suroot
fonte
5
Eu prefiro --color = auto porque ele não envia caracteres de controle de lixo se redirecionar para o arquivo, você também pode fazer o apelido grep = "grep --color = auto" para destacar os padrões correspondentes.
+1 para --color = automático; alguém poderia aumentar a resposta com isso?
314 Jonik
Eu acho que tty faz a mesma coisa que auto aqui.
joshudson
Atualizado para refletir a cor = auto
Suroot
Estranhamente, a coloração torna as coisas muito menos legíveis para mim. Amarelo-branco, por exemplo, não é uma boa opção de coloração.
20

Alguns pequenos ponteiros sobre a visualização de logs:

  1. Você pode usar tail -F para continuar assistindo o log depois que ele for truncado (por exemplo log4j).
  2. Você pode usar menos: abra menos, clique em SHIFT + F para emular o comportamento da cauda. A combinação também útil é -S para desativar a quebra de linha. menos permitirá que você pesquise nos logs.
Maxim Veksler
fonte
1
E com tail -fvocê pode assistir vários registros de uma só vez! Exemplo:tail -f log1.txt -f log2.txt
Stu Thompson
@StuThompson: Obrigado. não sabia disso. Além disso, você pode querer fazer o checkout vanheusden.com/multitail
Maxim Veksler
20

Há muito tempo, aprendi um truque com um amigo para alterar facilmente a extensão de um arquivo:

mv my_filename.{old,new}

A expansão da Shell expandirá isso para:

mv my_filename.old my_filename.new

Isso também pode ser usado para renomear um arquivo de outras maneiras, como adicionar algo em:

mv my_{,cool_}filename
Scotty Allen
fonte
6
Apenas não coloque caracteres curinga ou outras expressões de padrão no mesmo comando, ou a glob poderá se expandir para mais do que apenas 2 argumentos! mv *. {old, new} provavelmente produzirá resultados realmente surpreendentes.
Sim, concordou - esta é uma ressalva importante :)
2
Você também pode digitar, por exemplo, ls -l /bin/ce pressionar Alt-Shift- {e isso fará com que seja parecido ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}com você.
Dennis Williamson
19

Use "tar xf" para extrair arquivos compactados. O j para bzip2 ez para o gzip não são necessários, pois o tar detectará o tipo de arquivo do seu arquivo. Nem é sinal '-' antes dos argumentos. Você economizará muito tempo (mais de um milênio ;-)).

Melhor ainda, use unfoo para extrair qualquer arquivo morto com um único comando, sem argumentos desnecessários.

kyku
fonte
Sim, eu tenho alias ut="tar xf"- torna a extração de arquivos ainda mais fácil.
David Wolever 13/09/09
Isso falha em algumas distribuições RHEL, se você as usar.
Pvsnp 20/10/09
O novo alcatrão tem também interruptor "J" para comprimir a xz (com base 7zip) arquivos
Hubert Kario
Ou instale unp: packages.debian.org/sid/unp . Eu acho que é semelhante ao unfoo.
Zitrax
17

Instale o pacote de conclusão do bash. Ele contém várias regras de conclusão predefinidas para o shell. Habilite-o digitando "source / etc / bash_completion" se a sua distribuição não o fizer. Por exemplo, sempre que você concluir o kpdf, verá apenas uma lista de diretórios e arquivos PDF. É tão inteligente quanto concluir arquivos remotos após scp ssh: // server / XXX (se você ativou logins sem senha).

kyku
fonte
17

Eu uso constantemente esses

ALT-. (ESC +. Em alguns terminais) copia o último argumento usado (super útil)

CTRL-W exclui a palavra

Terminal CTRL-L clear (como comando clear, mas mais rápido)

ALT-B (ESC + B em alguns terminais) retrocede uma palavra

ALT-F (ESC + F em alguns terminais) avança uma palavra

CTRL-E pula para EOL

CTRL-A salta para BOL

Pesquisa CTRL-R no histórico

Álvaro
fonte
1
Obrigado por compartilhar os atalhos! Não consegui que o ALT-B / F funcionasse no Mac.
Léo Léopold Hertz · 23/03/09
Homem incrível ....
Daud Ahmad Khokhar
16

No bash, eu uso muito ! $ . Ele repete o último argumento do último comando:

ls /really/long/command/argument/that/you/dont/want/to/repeat.txt
vi !$

Ele executará o ls; se você quiser editá-lo, não precisará digitá-lo novamente, basta usar! $. Isso é realmente útil para nomes longos de caminho / arquivo. Além disso ,! * Repete todos os argumentos do comando anterior. Eu não uso muito isso, mas parece útil.

Eu sabia que eles foram mencionados, mas eu uso vim, screen e cd - muito.

Eu esqueci noclobber:

set -o noclobber

De man bash :

Se definido, o bash não substitui um arquivo existente pelos operadores de redirecionamento>,> &, e <>. Isso pode ser substituído ao criar arquivos de saída usando o operador de redirecionamento> | em vez de>.

gpojd
fonte
6
Eu não uso $ !, pois é realmente fácil engordar, mas eu gosto de bater em ^ [-. (período de escape) para obter o mesmo efeito.
David Wolever 13/09/09
7
Dependendo do teclado, etc., você também pode Alt-..
Dennis Williamson
Omg, pequeno orgasmo, ty Dennis!
Artifex
14

Alterne do bash para o zsh e veja sua produtividade melhorar:

  • Conclusão de guias realmente inteligente e com script. Ele completa não apenas as linhas de comando, mas todas as opções, nomes de páginas de manual, nomes de pacotes (para apt-get / emerge etc) e o que você possui. E fornece uma explicação útil das opções durante a conclusão. Tudo isso sem usar nenhum espaço de rolagem após o comando ter sido emitido.
  • Conclusão de tabulação de curingas; escreva cat * .txt, pressione tab e escolha entre os arquivos que correspondem à expressão.
  • Alterne diretórios apenas digitando seus nomes.
  • Vários modos de edição de linha. Pode se comportar como vi ou emacs, se você quiser.
  • Ligações de teclas personalizáveis ​​para fazer o que quiser.
  • Prompts estáveis, incluindo a capacidade de colocar informações rápidas no lado direito da tela e ocultar automaticamente ao digitar um comando longo

O Google fornecerá muitos outros benefícios.

flodin
fonte
1
você deve dar mais do que um link. Parece interessante, mas venda para mim, cara!
Eles conseguiram incluir suporte unicode?
@Cory Tudo bem, eu só não queria plagiar e parecia redundante para escrever meu próprio quando há tanta coisa boa escrita por outros já :)
@kyku sim, há suporte unicode adequado desde talvez um ano atrás.
parece legal. eu vou tentar!
13

Old school, movendo uma árvore de diretórios de um lugar para outro, preservando links simbólicos, permissões e todas as coisas boas:

tar cBf - . | (cd /destination; tar xvBpf -)

ou através da rede

tar cBf - . | rsh foo.com "cd /destination; tar xvBpf -)

Nova escola:

rsync -urltv . /destination

ou através da rede

rsync -urltv -e ssh . foo.com:/destination
Paul Tomblin
fonte
tar xvBpf - -C /destination== (cd /destination; tar xvBpf -) Um pouco menos de digitação e mais fácil de usar sobre ssh.
519 ephemient
1
-a é o mesmo que '-rlptgoD' - isto é, copia links simbólicos como links simbólicos, preserva permissões, preserva carimbos de data e hora, preserva grupos, preserva proprietários, copia arquivos de dispositivos e arquivos especiais como dispositivos e arquivos especiais. Além disso, entre máquinas, -z (compacta arquivos antes do envio, descompacta após o recebimento) é útil. rsync -avz [-e ssh] é seu amigo :-)
dr-jan
-Z faz algum bem ao invés de ssh? Eu não pensaria assim.
21119 Paul Tomblin
rsync -avhé melhor em uma única máquina - hgarante que os links físicos sejam transferidos corretamente sem transformar cada link em um arquivo separado, embora, se você tiver um número enorme de arquivos, ele possa usar muita memória. rsync -avzh . foo.com/destinationé o equivalente para a rede e, geralmente, você não precisa do -e sshcomo o rsync saberá usar ssh.
RichVel 27/08
Na verdade, hoje em dia estou usandorsync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
Paul Tomblin
13

Requisito : você tem um diretório que contém uma grande lista de arquivos que você deseja excluir. rm -r falhará!

exemplo

find /var/spool/mqueue/ | wc -l
191545
rm -f /var/spool/mqueue/*
-bash: /bin/rm: Argument list too long

Solução :

find /var/spool/mqueue/ -xdev -exec command rm -f '{}' +

Explicação :

Edit: Fixing explanation following @ephemient comment.

find fornecerá argumentos para rm pelos argumentos máximos permitidos. Isso permitirá que a rm exclua arquivos em lotes, que é a técnica mais rápida que eu conheço sem usar a operação -delete de encontrar a si mesma. É equivalente a

find /var/spool/mqueue -xdev -print0 | xargs -0 rm -f

que você pode achar útil se o seu findnão suportar -exec ... +.

Maxim Veksler
fonte
5
Substitua \;por +: então findfará o que xargsfaz por padrão, que é agrupar os argumentos o máximo possível (sem ultrapassar o limite da lista de argumentos). Ou simplesmente usar -deleteintead de -exec rm(GNU Findutils necessários para ambos)
ephemient
Boa dica - eu não conhecia o '+'.
codeinthehole
@ ephemient: Bom comentário, eu editei o post.
Maxim Veksler
2
Interessante, eu não tinha ouvido falar de '+'.
user18911
ou apenas find ... -delete, se a sua descoberta for tão dotada.
David Wolever 13/09/09
11

Eu uso essas duas dicas com tanta frequência que achei que seria uma boa idéia compartilhar:

!foo

Inicia o último comando no arquivo de histórico que começa com "foo" (geralmente o uso na compilação, !gccpor exemplo).

O outro é um atalho de teclado (Ctrl + O em vez de Return); este executará o comando E exibirá o próximo comando no arquivo de histórico. Por exemplo, quando eu compilar e testar um arquivo, eu sempre executo 3 ou 4 comandos, faço cd para o diretório do teste, execute o teste, cd para o diretório do makefile. O uso de Ctrl + O torna essa tarefa muito mais fácil :)

Espero que esta ajuda!

claferri
fonte
1
+1 para Ctrl-O
Dennis Williamson
10

Como usar o subversion no Linux sem a ajuda de interfaces gráficas sofisticadas que podem não estar disponíveis.

svn co <repo-url> . # Checks out project into current folder

svn update # Get latest changes from server

svn status # Shows what files have changed locally

svn add <path/filename> # Add some file to the repo

svn commit # Commit your changes to the repo

Isso impede muitos desenvolvedores de usar o Linux, por incrível que pareça.

pós-futebolista
fonte
rapidsvn é uma pequena e agradável interface gráfica para svn no Linux.
Muitos fantasia, GUIs poderosos são certamente disponível (como aquele no IntelliJ IDEA), mas eu gosto da possibilidade de utilizar, quer aqueles ou a linha de comando (também poderoso, mas differrently) - o que se adequa à situação atual melhor
Jonik
O meu favorito de longe é NautilusSVN (muito parecido com TortoiseSVN): code.google.com/p/nautilussvn
user7655
10

O comando mais negligenciado da velha escola: find

Ontem eu consertei um bug de permissões brutas:

for u in nr dias simonpj; do
   sudo -u $u find . -type d -exec chmod g+s '{}' ';'
done
Norman Ramsey
fonte
Sim! Aprenda o comando find. Encontrar misturado com xargs, sed e awk contribui para um enorme processo de processamento de arquivos!
Jonathon Watney 03/03
Acordado! Embora eu nunca me lembre de nada sobre sed e awk - eu sempre preciso reaprendê-lo! Eu realmente deveria imprimir uma folha de dicas.
Sim, mas não se esqueça de usar -print0 e a opção -0 no xargs para evitar problemas complicados envolvendo nomes de arquivos que contêm caracteres incomuns (por exemplo, barra invertida).
user18911
Sim, provavelmente, metade do tempo eu uso encontrá-lo é para consertar as coisas de permissão estúpidas: chmod 644 $(find . -type f),chmod 755 $(find . -type d)
David Wolever
1
Não esqueça a -permopção de findlocalizar arquivos com permissões definidas de uma certa maneira.
Dennis Williamson
8

Para shells como bashe ksh, você pode fazer a linha de comando responder aos comandos de navegação como seu editor de texto:

set -o emacs

ou

set -o vi

permitirá que você pesquise seu histórico e mova-se pela linha de comando da maneira que você está acostumado a fazer em arquivos de texto (por exemplo, no modo vi, pressionar ESCe digitar /stringpesquisará "string" nos comandos anteriores - você pode usar ne Nmover entre correspondências)

Tim Whitcomb
fonte
Typo menor: "editor de teste" deve ser "editor de texto"
8

grep é meu amigo. A sério.

Listar .rbarquivos que contêm o texto class foo:

grep -l "class foo" .rb

Listar .rbarquivos que não contêm o texto class foo:

grep -L "class foo" *.rb

Liste os .rbarquivos que não contêm foo ou bar (você pode usar qualquer regexp com -e, mas precisa escapar dos operadores):

grep -L -e "foo\|bar" *.rb
Sarah Mei
fonte
Você pode estar interessado em uma ferramenta chamada "ack", que faz o mesmo que o grep, mas verifica recursivamente apenas os arquivos de origem. Experimente (é grátis): betterthangrep.com
8

A substituição do shell é realizada com ^:

/home/eugene $ ls foo.txt
foo.txt
/home/eugene $ ^ls^rm
rm foo.txt
/home/eugene $ ls foo.txt
ls: cannot access foo.txt: No such file or directory
Eugene Morozov
fonte
2
Na verdade, prefiro "!!: gs / foo / bar", já que muitas vezes acho que foo é mencionado mais de uma vez no comando anterior e quero uma substituição global (por exemplo, "mv foo.txt foo.bak").
user18911