O ponto chave é este: As extensões são irrelevantes em qualquer sistema do sistema Unix-like. Um nome de arquivo é apenas nome e não tem efeito sobre se script ou executável compilado pode ou não ser executado . Um programador pode adicionar uma extensão .sh
para designar que um arquivo é shell script, ou .py
para script python, mas diferente do Windows, qualquer unix não se preocupa com nomes, ele se importa com permissões.
O que importa é a permissão executável concedida a um arquivo. Qual você pode verificar com
ls -l /path/to/file
Execução de executáveis
Para executar o script, geralmente há várias maneiras.
- Se o seu diretório atual for o mesmo que o script e o script tiver permissões executáveis, você poderá executá-lo assim
./my_script_name
. O .
significa o diretório atual.
- Se o seu diretório atual for diferente e o script tiver permissões executáveis, você poderá executá-lo especificando o caminho completo:
/home/user/bin/my_script_name
(Os dois métodos acima dependem do conjunto de permissões executáveis; independentemente de o arquivo fazer parte da variável $PATH
ser irrelevante. A presença da linha #!
também é importante; sem ela, o script será executado pela corrente shell que você tem aberto.Se eu tiver csh
script sem essa linha, e tentar executá-lo no bash com ./my_script.csh
, ele irá falhar)
- Se o seu script estiver localizado no diretório que faz parte da sua variável
$PATH
, você poderá executá-lo apenas chamando o nome. Você pode chamar o comando chmod
na linha de comando apenas digitando seu nome porque está na pasta /bin
. /bin
é sempre parte da variável $PATH
. Neste caso, permissões executáveis e localização do material do script
- Especificando um interpretador como comando e script como argumento. Dessa forma, o script servirá como arquivo de entrada para o interpretador.
- Fornecendo um arquivo. O
. filename.sh
ou source filename.sh
fará com que o script seja tratado como se fosse uma entrada de teclado, ou seja, como se tivesse sido digitado diretamente na linha de comando. Neste caso, permissões e localização executáveis não importam
Exemplos
Exemplo # 1, em execução com o interpretador, para permissões de execução
$-> ls -l abc.py
-rw-rw-r-- 1 xieerqi xieerqi 44 Apr 27 22:39 abc.py
$-> python abc.py
a
b
c
Exemplo # 2, em execução com o conjunto de permissões executáveis ./
, conjunto de linhas shebang.
$-> cat abc.py
#!/usr/bin/env python
for letter in 'a' 'b' 'c' :
print letter
$-> ls -l abc.py
-rwxrwxr-x 1 xieerqi xieerqi 66 Apr 27 23:02 abc.py*
$-> ./abc.py
a
b
c
Exemplo # 3, rodando sem o conjunto de linhas shebang (falha, porque o bash não pode ler scripts python; nenhuma linha shebang assume o shell atual como intérprete)
$-> cat abc.py
for letter in 'a' 'b' 'c' :
print letter
$-> ./abc.py
./abc.py: 2: ./abc.py: Syntax error: word unexpected (expecting "do")
Exemplo # 4, executando o script que possui permissões executáveis configuradas na pasta de formulário que faz parte de $PATH
variable
# /home/xieerqi/bin is part of my path variable
$-> echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/microchip/xc16/v1.25/bin:/opt/microchip/xc32/v1.40/bin:/opt/microchip/xc8/v1.35/bin:/home/xieerqi/bin:/home/xieerqi/bin/sh
$-> # current directory is /home/xieerqi
$-> pwd
/home/xieerqi
$-> # move the file to ~/bin
$-> mv ~/abc.py ~/bin/abc.py
$-> # now I can run it just by calling the name
$-> abc.py
/home/xieerqi/bin/abc.py: 2: /home/xieerqi/bin/abc.py: Syntax error: word unexpected (expecting "do")
$-> # Syntax error because again, no interpreter specified.
$-> # must add #!/usr/bin/env python
$-> vi /home/xieerqi/bin/abc.py
$-> # after adding the line with vi text editor, we can run
$-> abc.py
a
b
c
O exemplo # 5, removendo a extensão, ainda é executado porque as extensões não importam, mas tem permissões e faz parte de $PATH
:
$-> mv ~/bin/abc.py ~/bin/abc
$-> abc
a
b
c