Melhor resposta
#!/bin/bash
Isso é conhecido como shebang, ele diz ao intérprete que as seguintes linhas são escritas para bash, então execute este arquivo como script bash.
#Example: Scripts are usually executed like below:
./scriptName
Assim, o shebang determina como interpretar o script, às vezes pode ser o seguinte:
#!/bin/sh
#!//usr/bin/perl
#!/usr/bin/python
#!/bin/bash
#!/bin/ksh
Portanto, essas linhas determinam como os scripts devem ser interpretado e executado. agora chegando a Por que /bin/sh
?
Ele aponta para um dos shell configurados, às vezes sh
aponta para bash
, às vezes algum outro shell como cshell, dash,zsh ,ksh
etc.
Exemplo:
#case-1:
ls -lrt /bin/sh
lrwxrwxrwx 1 root root 4 Feb 19 2014 /bin/sh -> dash
#case-2
ls -lrt /bin/sh
lrwxrwxrwx 1 root root 4 Jul 12 2017 /bin/sh -> bash
Portanto, se você estiver usando #!/bin/sh
em seu script, o comportamento de seu script será diferente com base em qual shell sh
está apontando para o seu sistema. Observe que você pode substituir o shebang executando seu script como:
bash scriptName
#or
sh scriptName
Nos dois casos acima, shebang não afetará a execução e será feito por bash
e sh
(shell apontado por isso).
Resposta
Bem, exatamente como eles funcionam tem muitos níveis de detalhe, portanto, seremos bastante inexatos aqui. Todos os programas são executados colocando seu código em uma seção específica e dedicada da memória e, em seguida, invocando o ponto de entrada dessa imagem de código na memória. Depois disso, o programa apenas é executado.
O ato de colocar a imagem do código na memória é realizado pelo Sistema Operacional e é o que chamamos de ‘lançar’ ou executar o programa. O sistema operacional faz isso por iniciativa própria apenas uma vez; no momento da inicialização, quando ele inicia o processo init . O processo init e seus descendentes pedem ao sistema operacional para iniciar outros processos, invocando o exec Chamada de sistema do sistema operacional.
O shell é ao mesmo tempo especial e comum. É apenas mais um programa executado, como qualquer outro. Não tem superpoderes particulares ou propriedades especiais. Tem como objetivo permitir ao usuário acessar os serviços do SO, principalmente para lançar outros programas que o usuário especificar. Ele fornece métodos acessíveis ao usuário que permitem ao usuário acessar o sistema de arquivos e especificar como alguns fluxos padrão de comunicação de dados são usados ( stdin , stdout e stderr ).
Os shells fornecem uma linguagem de programação que pode ser usada para fazem as coisas de maneiras automatizadas, tomando decisões e iterando, para obter eficiência e, assim, podem funcionar sem interação do usuário. Eles fornecem e usam uma sintaxe especial e notação que o usuário deve aprender e usar para invocar a linguagem de programação e o processamento da linha de comando. O processamento dos comandos do shell pode vir de um terminal interativo ou de arquivos de texto contendo scripts.
Os programas que um shell inicia são chamados de processos filhos do shell. Qualquer processo pode lançar outro processo, então o shell não é especial nesse sentido. O shell é otimizado para permitir que o usuário especifique como iniciar seus processos filhos. Você pode ver a hierarquia de todos os processos em um host Linux usando o comando
ps -e lf
Em algum lugar da lista você encontrará o próprio processo ps , e aparecerá como um processo filho do processo shell que você usou para iniciá-lo.
Lá são muito mais detalhes; muitos para cobrir em uma resposta do Quora.