Os scripts bash são iguais aos scripts shell?

58

Eu sou muito novo no Ubuntu. Eu ouço as pessoas dizerem "shell scripting", "bash scripting".

Eu me pergunto, eles são iguais? Ou eles são diferentes?

homem Morcego
fonte
Existe uma resposta útil em SO
Sr. Pei

Respostas:

55

O Bash ( bash) é um dos muitos shells Unix disponíveis (ainda os mais usados). Bash significa " B ourne A gain SH ell" e é uma substituição / melhoria do shell Bourne original ( sh).

Os scripts do shell são scripts em qualquer shell, enquanto os scripts do Bash são scripts especificamente para o Bash. Na prática, no entanto, "shell script" e "bash script" são frequentemente usados ​​de forma intercambiável, a menos que o shell em questão não seja o Bash.

EDIT: Na verdade, o shell de script padrão no Ubuntu é traço, enquanto o shell interativo padrão (o que você obtém se você abrir um terminal) é Bash. No entanto, os dois termos ainda são basicamente intercambiáveis.

Hilton Shumway
fonte
11
O que define o traço como o shell de script padrão?
Wjandrea
11
@wjandrea O fato de /bin/shser um link simbólico /bin/dashtorna o shell do sistema padrão , mas não é o shell de script padrão , ou seja, não existe uma regra escrita que você precise usar absolutamente /bin/sh. Quando se usa /bin/sh, é principalmente por motivos de portabilidade, quando você espera que seu script seja usado em várias plataformas de sistemas operacionais semelhantes ao Unix, a maioria das quais com /bin/shshell da família Bourne compatível com POSIX.
Sergiy Kolodyazhnyy
29

Introdução

Script de shell e Bashscript não são a mesma coisa, pois existem outros shells, como o shque pode ser usado para executar um script; um script destinado a ser executado por Bashdeve ser rotulado como um Bashscript. Os termos geralmente são usados ​​de forma intercambiável porque Bash, com sua funcionalidade estendida em comparação com sh, é o mais comumente usado para executar scripts de usuário em muitas distribuições. No entanto, existem outros shells, como o Korn (ksh), C shell (csh)e o Z shell (zsh), mas não iremos abordá-los aqui como uma discussão she bashé mais relevante para o Ubuntu. Um excelente artigo da IBM aqui detalha a evolução dos shells no Linux e descreve bem a arquitetura do shell e como os shells diferem.

Script de Shell

Shfoi o shell Unix original desenvolvido por Stephen Bourne; no entanto, os sistemas baseados no Debian e o Ubuntu consideram dashseu shshell ( shna verdade, está vinculado a dash). No Debian e no Ubuntu, devido à velocidade sh, é mais frequentemente usado para procedimentos críticos do sistema e para executar scripts importantes na inicialização; para mais detalhes veja o wiki do Ubuntu . Bashsignifica Bourne Again SHell e foi desenvolvido mais tarde por Brian Fox e ampliou muito o original sh. O desenvolvimento de Fox e outros Bashfoi uma parte importante do projeto GNU. Veja esta grande discussão sobre a história de Bashpara mais informações.

É importante observar que ambos she Bash, como usado no Ubuntu e em outras distribuições, são POSIXcompatíveis, o que significa que eles assinam vários padrões sobre como os comandos são executados no Shell. Isso é para garantir que os resultados dos scripts usados ​​no sistema operacional possam ser previstos com confiabilidade e que o comportamento do shell possa ser mantido dentro desses POSIXparâmetros, pois isso é particularmente importante para os desenvolvedores. Para mais informações sobre os padrões, consulte a documentação oficial .

Freqüentemente, os scripts de shell têm o sufixo .sh, mesmo que tenham a intenção de serem executados como bashscripts e tenham #!/bin/basha parte superior do script. Na verdade, não importa se o script é chamado script.sh ou my.script , o que importa é se a chamada para o intérprete é /bin/shou /bin/bash. Os scripts de shell também podem ser chamados na linha de comando com shou bash.

No entanto, é importante observar que os resultados podem ser diferentes, dependendo de qual intérprete é chamado, pois nem todos os bashcomandos funcionam sh, enquanto a maioria dos shcomandos funciona bash. Em geral, a maioria dos usuários deseja usar /bin/bashpara seus scripts, para que possam tirar proveito do conjunto de recursos estendidos; os scripts do sistema podem ser executados com, /bin/shse necessário.

Recursos para scripts do Bash Shell

Às vezes, é difícil encontrar recursos úteis on-line que sigam as boas práticas e que ofereçam conselhos que permitirão criar scripts úteis. Depois man bash, alguns dos recursos mais importantes são o wiki de Greg , os hackers Bash e o livro recente de Steve Parker sobre scripts da Shell, que se concentra principalmente Bashe é publicado por O'Reilly. Uma boa introdução também é realizada pelo Guia para iniciantes do Bash .


fonte
2
Esta resposta é realmente superior à minha (a resposta aceita), a minha veio apenas uma semana antes desta.
Hilton Shumway
4

Existem vários shells disponíveis para Ubuntu, como bash, zsh, ksh, tcshe csh.

Assim, sempre que alguém diz shell , ele está falando de um desses. No entanto, essas conchas diferem um pouco uma da outra. Então, quando alguém fala sobre bashscripts, ele está usando um shell, mas quando alguém está falando sobre scripts de shell, ele não está em si bash. Mas como bashé comumente usado em scripts para Ubuntu, ele geralmente é. Além disso, as diferentes conchas são as mesmas em muitos aspectos, por isso geralmente não importa.

fromnaboo
fonte
2
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 29 11:53 /bin/sh -> dash*
$ ls -l /bin/dash
-rwxr-xr-x 1 root root 109768 Mar 29 11:53 /bin/dash*
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 955024 Apr  3 08:58 /bin/bash*

Isso mostra que 'sh' é um link simbólico para 'dash', e que / bin / bash, que é o shell interativo padrão no Ubuntu, é um executável quase 9 vezes maior que / bin / sh.

De fato, 'man sh' (1590 linhas) vs 'man bash' (5459 linhas) revela que bash é um grande superconjunto do tradicional 'sh'.

Leia mais aqui:

arielf
fonte
2

O script do shell seria definido como um script orientado à portabilidade, que pode ser executado por um shell do sistema de sistemas operacionais compatíveis com POSIX. A sintaxe seria idêntica ou semelhante à sintaxe da linguagem de script de shell definida pelo padrão POSIX. Esse é o padrão para a maioria dos sistemas operacionais compatíveis com POSIX, como Linux / Unix / * BSD etc. O POSIX é o caminho mais comum para compatibilidade entre sistemas operacionais.

Diferentes sistemas operacionais dos mencionados acima implementam shells diferentes para o uso não interativo (por exemplo, para executar scripts do sistema ou scripts que usam #! /bin/shshebang) que, além de implementar comandos e sintaxe POSIX, têm suas próprias extensões ou podem ser removidos de alguns recursos menos úteis por motivos de desempenho, mas o terreno do POSIX permite um nível muito alto de portabilidade de scripts projetados para diferentes sistemas operacionais compatíveis com POSIX.

A maioria referido OSs têm shell interativo separado, que geralmente é cheio de recursos do bash . O Bash é compatível com POSIX em grande parte, mas também possui um grande conjunto de comandos adicionais e suporta sintaxe diferente. Iniciar o Bash com a opção de linha de comando --posix ou executar 'set -o posix' enquanto o Bash estiver em execução fará com que o Bash se adapte mais estreitamente ao padrão POSIX, alterando o comportamento para corresponder ao especificado pelo POSIX nas áreas em que o Bash padrão difere, consulte: https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html

Especificador Shebang e caminhos uniformes para executáveis ​​de shell em sistemas operacionais semelhantes a Unix

Graças às regras uniformes sobre a colocação de executáveis ​​para shells (geralmente estão no diretório '/ bin /'), podemos ter regras uniformes para a criação de scripts shell, mais especificamente, estamos claros qual o caminho a ser inserido na expressão shebang para apontar para um shell executável adequado para executar o script. Os sistemas de arquivos Unix / Linux / * BSD não suportam extensões intrinsecamente, portanto, as extensões de arquivos servem apenas como uma dica adicional ou para fins de indexação.

No Debian / Ubuntu especificamente, bin/shhá um link simbólico apontando para o bin/dashqual é um executável de um shell de traço . Isso faz do dash o shell do sistema, que é estimado em 4x mais rápido e tem um tamanho de aproximadamente 1/10 do que o bash mais funcional. fonte: https://unix.stackexchange.com/questions/148035/is-dash-or-some-other-shell-faster-than-bash

Terminal interativo do Debian / Ubuntu é, por padrão, como em muitos outros sistemas operacionais Unix-like, festança, para a qual o caminho também é uniforme: /bin/bash.

Padrão POSIX.1-2017: http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html

A regra geral seria:

Se um comando ou opção não for definido pelo POSIX, não o coloque em um #! /bin/shscript.

Converta seu script ou verifique se há erros

Para converter seu script do formulário bash para POSIX, convém verificar automaticamente se há bugs no script shell ou ver quais alterações em seu script bash você deve fazer para torná-lo compatível com POSIX:

https://www.shellcheck.net/

http://mywiki.wooledge.org/Bashism

Ola
fonte
11
Resposta muito boa, +1. Bem-vindo ao AskUbuntu!
Sergiy Kolodyazhnyy 15/01
11
Em relação ao Dash como / bin / sh no ubuntu, há um artigo para o qual você também pode citar. E também há askubuntu.com/q/976485/295286
Sergiy Kolodyazhnyy