Como eu aprendo scripts de shell bash?

5

Eu sou um usuário do Mac e um desenvolvedor da Web e gostaria de criar ferramentas automatizadas para gerenciar meu fluxo de trabalho. Diga um único comando para iniciar um tipo de site.

Que partes do bash shell script devo aprender? Há muitos:

  • sed
  • awk
  • grep
  • encontrar

Ou deveria estar aprendendo outra coisa para arquivar a automação de linha de comando para meus projetos da web?

Amit Erandole
fonte
1
Estes são os que eu uso com mais freqüência, mais os comandos de modificação fle (rm, mv, cp, touch, mkdir).
Daniel Beck
1
Para uma extensa lista de guias, confira a excelente resposta do @Lri Aqui .
Daniel Beck

Respostas:

11

Você precisa estar ciente de que, diferente de outras linguagens de script ou de programação, shell scripts pesadamente depende dos aplicativos de linha de comando fornecidos pelo SO. Isso significa que, como o OS X é um BSD, muitas das coisas que funcionam no Linux funcionarão um pouco diferente no seu computador, inutilizando muitos tutoriais. Em geral, você pode esperar que suas ferramentas de linha de comando tenham menos recursos e flexibilidade do que as contrapartes do Linux, embora haja exceções.

Se você não estiver familiarizado com o shell e não sentir uma grande necessidade de aprendê-lo, talvez seja melhor usar sua linguagem de script da Web favorita (PHP, Ruby, Python) na linha de comando. A vantagem é a API provavelmente mais consistente em toda a biblioteca de funções.


Em bash em si, aprenda

  • Condições (incluindo o uso de test / [... ] para programação defensiva ao manusear arquivos)
  • rotações
  • Atribuição variável
  • Funções
  • Redirecionamento e tubulação de entrada e saída
  • Chamar programas e funções de shell (incluindo como capturar sua saída e ler seus valores de retorno), tanto chamadas regulares quanto com substituição de comando.
  • Opções eu amo set -u e se recusam a trabalhar com scripts que não podem lidar com isso.
  • Tipos de variáveis, matrizes, globbing

O problema aqui é que bash está muito ligado ao sistema com coisas como controle de tarefas e, para a criação de scripts complexos, tem uma curva de aprendizado bastante íngreme.

Na minha experiência * nenhuma seção do bash A página man é desnecessária. Faz tempo suficiente e tudo lá é aplicável de alguma forma (e se é apenas para responder a perguntas sobre SU).


Alguns (na minha experiência) programas comumente usados ​​em scripts de shell:

  • Manipulação e navegação de arquivos: find, ls, cd, rm, mv, cp, chmod, chown, chflags, dd, ln
  • Execução do programa: xargs, find -exec
  • Transformação de dados: sort, wc, cat, sed, awk, grep

Específicos para o OS X são provavelmente os seguintes:

launchctl, open, dscl, PlistBuddy, plutil, osascript, automator, networksetup, systemsetup, growlnotify (se você tiver Growl)

E, claro, dependendo da natureza exata do que você quer fazer, existem outros ...

date (Variante BSD - muito diferente do GNU), mount, fsck, kill, sendmail


Alguns, e. netcat exigir que você instale pacotes de terceiros, por exemplo usando Homebrew, MacPorts ou Fink.

Se seus scripts usam intensamente esses programas de linha de comando, ou podem ser escritos de tal forma, bash scripts são uma boa maneira de automatizar isso.


Como você está no OS X, procure também no AppleScript (via AppleScript Editor) e no Automator. Ambos podem ser combinados com scripts de shell para obter soluções de script bastante bem integradas. Se você está procurando controlar outros aplicativos do OS X (por exemplo, seu navegador da Web), eles são indispensáveis. Enquanto você pode abrir URLs em diferentes navegadores usando open na linha de comando, recuperando dados, por exemplo das guias carregadas requer o Automator ou o AppleScript.

Além disso, outras linguagens de script, como ruby, python também são pré-instalados no seu Mac e podem ser usados ​​para criar facilmente utilitários auxiliares simples. Estes são mais de uma substituição de bash e utilitários regulares do UNIX. Depende da natureza do que você quer fazer.

Se você quiser mover um punhado de arquivos pelo seu disco, feche-os e transfira-os via SSH, bash é provavelmente a melhor escolha. Assim que você tiver real lógica de programação (qualquer coisa que envolva muitos objetos ou números), você provavelmente deveria procurar em outras linguagens de script.

Daniel Beck
fonte
+1: "... talvez seja melhor usar sua linguagem de script da web favorita (PHP, Ruby, Python) na linha de comando..." IMO, isso provavelmente faz mais sentido e fornece uma habilidade mais geral definida nas situações da maioria das pessoas.
surfasb
@surfasb depende da natureza dos seus scripts. Se você copiar os arquivos e, em seguida, transferi-los via scp para uma máquina diferente, o bash é provavelmente mais fácil de fazer isso. Assim que você lê arquivos binários ou faz qualquer tipo de computação, o bash deixa de ser divertido.
Daniel Beck
1

Eu publiquei uma lista de marcadores (OS X e centrada no bash) em Tutoriais de terminal do OS X - Super User .

Uma das melhores maneiras de aprender uma linguagem de script é modificar os scripts existentes. Dê uma olhada em coisas como:

Alguns livros com exemplos de código para download gratuito:

Lri
fonte
0

Eu acho que para você, apenas o uso básico de cerca de 20 a 25 comandos é suficiente, e a arquitetura básica do Linux é obrigatória. Dependendo do seu tipo de trabalho, você pode começar a aprender apenas sobre esses comandos bash:

vi, ls, encontrar, sed, awk, grep, gato, serviço de inicialização e desligamento, netstat, nmap, traceroute, ping, mv, cp, rm etc.

Estes são os comandos mais comuns, que são usados ​​no bash.

Além disso, você pode seguir este tutorial:

http://www.faqs.org/docs/bashman/bashref_toc.html

http://blog.emson.co.uk/2009/06/18-useful-bash-scripts-for-web-developers/

Além disso, você precisa aprender scripts básicos de shell para automatizar alguns processos.

Farhan
fonte
Não há programa de serviço no OS X.
Daniel Beck
2
Como a declaração "você precisa aprender scripts básicos de shell" para a pergunta "Como eu aprendo script de shell básico" responde à sua pergunta no mínimo? Fornecer uma lista de comandos sem explicações links para tutoriais não está explicando nada.
MaQleod
@MaQleod bem, eu não iria culpá-lo por não dar links para aprender os comandos que ele mencionou .. ele pode procurar qualquer um deles.
barlop
Está tudo bem @MaQleod. As respostas estão ajudando embora sim alguns exemplos práticos legais seriam definitivamente grandes.
Amit Erandole