Quais destes enganos comuns em scripts shell você comete?
Talvez não sejam propriamente enganos nem erros, mas este artigo faz um interessante trabalho de listar uma série de construções relativamente comuns em scripts shell, mas que incluem algum problema de portabilidade, desempenho, legibilidade ou mesmo estilo. Eu cometo vários!
Saiba mais (pixelbeat.org).
• Publicado por Augusto Campos em
2008-05-14
I don’t do shell screeeeepts, you insensitive clod!
Excelente artigo. Só não concordo em _não_ usar bashismos.
Na minha opinião o Bash tem excelentes recursos que poder ser usados sem dó nem piedade.
Só precisa de bom-senso de apostar o shebang pra /bin/bash ao invés de /bin/sh, como muita gente faz (e acaba tendo resultados desagradáveis quando usa Ubuntu, por exemplo, que aponta o /bin/sh pra /bin/dash)
Tá melhorando o nível aqui. Até citação tá rolando. Quem vai começar com as analogias de carro? Mas posso estar errado… I’m new here. ;)
Concordo com o colega acima. Não existem “bashismos”. Ou vc escolhe um interpretador de comandos padrão, ou não sai do lugar.
Criar um script que seja “interoperável” entre vários interpretadores diferentes ao meu ver não tem aplicação alguma.
set i=10 # tcsh
i=10 # bash, zsh
set i 10 # fish
São a mesma coisa, mas em cada interpretador tem uma sintaxe diferente. Além do mais, quem ainda usa o sh (o shell padrão do unix, de 30 anos atrás)?
Eu costumo escrever scripts em bash com o máximo que o bash venha a me oferecer. Desde expansão de variáveis, aritmética, e coisas do tipo.
A maioria das distros linux e variantes Unix possuem o bash ou o csh, portanto não há problema algum em explorar ao máximo. Tirando o Ubuntu, que, como disse o colega acima, em versões anteriores trazia o interpretador dash (que eu não tenho a mínima idéia do que seja ;-)).
Se querem usar bashismos, que usem, mas o chamem de “Bash script”, não genericamente de “shell script”. Isto porque ‘shell’ não implica em Bash, em outras palavras, o Bash é um shell, mas shell não se limita ao Bash.
Portanto entende-se para shell script comandos escritos conforme as especificações POSIX, e espera-se que rodem em todos os shells compatíveis com POSIX, dentre eles o enxuto e rápido Dash.
Se você quer mais portabilidade/robustez ou não quer que seu script dependa de algum shell específico (embora livre nem sempre o Bash é a melhor escolha para um sistema), o melhor é seguir o POSIX, e um grande guia nesse sentido é o próprio Dash, onde não há “dashismos”.
Gostei do artigo, interessante, bom para aprender alguns truques… Shell é mesmo aprender lendo, eu acabo copiando erros de outros scripts…
GoblinX, um livecd brasileiro com base Slackware
Douglas, para coisas mais básicas é perfeitamente possível escrever scripts portáveis. Um script que faça:
cd /etc/
sed s/ab/cd/g arquivo.txt
Pode perfeitamente ser escrito em qualquer interpretador. Mas se vc quiser um script que exija algo mais, daí ou fica-se limitado ao básico que são as próprias ferramentas que o unix oferece, sem built-in algum do interpretador de comandos – não consigo escrever condições do tipo
[ $i -lt $j -a $k -ne $z ]
Pra mim é(( (i<j) && (k!=z) ))
mesmo sabendo que não é algo portável, mas visivelmente mais lógico.
Concordo quando diz: “chame bash script ao invés de shell script”. Mas discordo com relação ao dash. Quem foi que nventou aquela coisa? Durante o tempo q usei Ubuntu, percebia que ele era bem mais lento que o bash, mas não tinha coisas básicas que o bash tinha. Dash é padrão POSIX?
O Dash é POSIX sim. E, na teoria, é pra ser mais rápido que o Bash.
Mas não posso dar opinião sobre ele, já que nunca usei.
No Ubuntu deu pano pra manga a discussão de colocar /bin/sh apontando pra /bin/bash – mas eu concordo com o argumento do pessoal do Ubuntu e também do Douglas. Se você fez um bash script, o shebang deve apontar corretamente para /bin/bash.
[]‘s
O Dash, além de atender ao POSIX, depende de menos bibliotecas e executa scripts mais rapidamente. O número menor de dependências faz dele uma shell melhor adaptada a ser usada pelos processos do sistema, incluindo as do init e shutdown, e várias outras.
Respondendo ao questionamento, ele foi portado para o Linux por Herbert Xu, a partir do ash (do NetBSD). O autor original do ash foi Kenneth Almquist.
Para usar o bash, e não o dash, em um sistema que use o dash como o seu /bin/sh, basta declarar corretamente #!/bin/bash na primeira linha.
Gostei da iniciativa do Ubuntu de trocar o sh->Bash para sh->Dash pois obriga a ao invés de escrever o shebang com #!/bin/sh você acaba tendo que escrever sendo #!/bin/bash que torna a coisa mais oraganizada. Pois se escreveu em bash é para ser Bash e nunca shell