Respostas:
Para executar um sh
script não executável , use:
sh myscript
Para executar um bash
script 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 sh
e bash
).
/usr/bin/env
Geralmente, você verá hash bangs assim:
#!/bin/bash
O resultado é que o kernel executará o programa /bin/bash
para interpretar o script. Infelizmente, bash
nem 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 bash
enviadas em vários locais, como /usr/xpg/bin/bash
ou /usr/local/bin/bash
.
Para escrever um script bash portátil, não podemos, portanto, confiar na codificação do local do bash
programa. POSIX já tem um mecanismo para lidar com isso: PATH
. A idéia é que você instale seus programas em um dos diretórios existentes PATH
e 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 PATH
busca por você. Existe um programa que pode fazer uma PATH
pesquisa para você, porém, é chamado env
. Felizmente, quase todos os sistemas possuem um env
programa instalado /usr/bin
. Então, começamos a env
usar um caminho codificado, que faz uma PATH
pesquisa bash
e 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 bash
como argumento para o env
programa. Isso significa que não temos espaço para transmitir argumentos bash
. Portanto, não há como converter algo parecido #!/bin/bash -exu
com esse esquema. Você terá que colocar set -exu
depois 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 bash
em outro lugar. Esse é geralmente o caso no OS X (Macs), em que a Apple envia uma versão desatualizada /bin/bash
e os usuários instalam uma atualização /usr/local/bin/bash
usando algo como o Homebrew. Ao usar a env
abordagem que faz uma PATH
pesquisa, você leva em consideração a preferência do usuário e usa o bash preferido dele sobre aquele enviado com o sistema.
zsh
como meu shell, eu usaria o hashbang
#! /usr/bin/env zsh
?
#! /usr/bin/env zsh
se (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.sh
pode ser relativo, por exemplo, . bin/script.sh
executa o script.sh
no bin
diretório sob o diretório atual.
Primeiro, dê permissão para execução: -
chmod +x script_name
sh script_name
bash script_name
./script_name
NOTA : -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