Respostas:
Para executar um shscript não executável , use:
sh myscript
Para executar um bashscript não executável , use:
bash myscript
Iniciar um executável (que é qualquer arquivo com permissão executável); você apenas especifica pelo caminho:
/foo/bar
/bin/bar
./bar
Para tornar um script executável, dê a permissão necessária:
chmod +x bar
./bar
Quando um arquivo é executável, o kernel é responsável por descobrir como executá-lo. Para não binários, isso é feito observando a primeira linha do arquivo. Deve conter um hashbang:
#! /usr/bin/env bash
O hashbang informa ao kernel qual programa executar (nesse caso, o comando /usr/bin/envé executado com o argumento bash). Em seguida, o script é passado ao programa (como segundo argumento) junto com todos os argumentos que você forneceu ao script como argumentos subsequentes.
Isso significa que todo script que é executável deve ter um hashbang . Caso contrário, você não está dizendo ao kernel o que é e, portanto, o kernel não sabe qual programa usar para interpretá-lo. Poderia ser bash, perl, python, sh, ou qualquer outra coisa. (Na realidade, o kernel geralmente usa o shell padrão do usuário para interpretar o arquivo, o que é muito perigoso porque pode não ser o intérprete certo ou pode ser capaz de analisar parte dele, mas com diferenças sutis de comportamento, como o caso entre she bash).
/usr/bin/envGeralmente, você verá hash bangs assim:
#!/bin/bash
O resultado é que o kernel executará o programa /bin/bashpara interpretar o script. Infelizmente, bashnem sempre é enviado por padrão e nem sempre está disponível no /bin. Enquanto em máquinas Linux, geralmente existe, há uma variedade de outras máquinas POSIX onde são bashenviadas em vários locais, como /usr/xpg/bin/bashou /usr/local/bin/bash.
Para escrever um script bash portátil, não podemos, portanto, confiar na codificação do local do bashprograma. POSIX já tem um mecanismo para lidar com isso: PATH. A idéia é que você instale seus programas em um dos diretórios existentes PATHe o sistema possa encontrar seu programa quando desejar executá-lo pelo nome.
Infelizmente, você não pode simplesmente fazer isso:
#!bash
O kernel não fará (alguns podem) fazer uma PATHbusca por você. Existe um programa que pode fazer uma PATHpesquisa para você, porém, é chamado env. Felizmente, quase todos os sistemas possuem um envprograma instalado /usr/bin. Então, começamos a envusar um caminho codificado, que faz uma PATHpesquisa bashe o executa para que ele possa interpretar seu script:
#!/usr/bin/env bash
Essa abordagem tem uma desvantagem: de acordo com o POSIX, o hashbang pode ter um argumento . Nesse caso, usamos bashcomo argumento para o envprograma. Isso significa que não temos espaço para transmitir argumentos bash. Portanto, não há como converter algo parecido #!/bin/bash -exucom esse esquema. Você terá que colocar set -exudepois do hashbang.
Essa abordagem também tem outra vantagem: alguns sistemas podem ser fornecidos com a /bin/bash, mas o usuário pode não gostar, pode achar que está com defeito ou desatualizado e pode ter instalado o seu próprio bashem outro lugar. Esse é geralmente o caso no OS X (Macs), em que a Apple envia uma versão desatualizada /bin/bashe os usuários instalam uma atualização /usr/local/bin/bashusando algo como o Homebrew. Ao usar a envabordagem que faz uma PATHpesquisa, você leva em consideração a preferência do usuário e usa o bash preferido dele sobre aquele enviado com o sistema.
zshcomo meu shell, eu usaria o hashbang #! /usr/bin/env zsh?
#! /usr/bin/env zshse (e somente se) o código dentro do script deve ser executado pelo shell Z.
Para a casca de bourne:
sh myscript.sh
Para o bash:
bash myscript.sh
Se você deseja que o script seja executado no shell atual (por exemplo, você deseja que ele possa afetar seu diretório ou ambiente), você deve dizer:
. /path/to/script.sh
ou
source /path/to/script.sh
Observe que /path/to/script.shpode ser relativo, por exemplo, . bin/script.shexecuta o script.shno bindiretório sob o diretório atual.
Primeiro, dê permissão para execução: -
chmod +x script_name
sh script_namebash script_name./script_nameNOTA : -Você pode verificar se o arquivo é executável ou não, usando 'ls -a'
Pouca adição, para executar um intérprete da mesma pasta, ainda usando #! Hashbang nos scripts.
Como exemplo, um executável do php7.2 copiado de / usr / bin está em uma pasta ao longo de um script hello .
#!./php7.2
<?php
echo "Hello!";
Para executá-lo:
./hello
Que se comportam da mesma forma que:
./php7.2 hello