O ponto principal é o seguinte: as extensões são irrelevantes em qualquer sistema de sistema semelhante ao Unix. Um nome de arquivo é apenas o nome e não afeta se um script ou executável compilado pode ou não ser executado . Um programador pode adicionar uma .shextensão para designar que um arquivo é um script de shell ou .pypara um script python, mas, diferentemente do Windows, qualquer unix não se importa com nomes, se preocupa com permissões.
O que importa é a permissão executável concedida a um arquivo. Com o qual você pode verificar
ls -l /path/to/file
Executando executáveis
Para executar o script, geralmente existem várias maneiras.
- Se seu diretório atual for o mesmo que o script e o script tiver permissões executáveis, você poderá executá-lo dessa maneira
./my_script_name. O .diretório atual significa.
- Se o 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; se o arquivo faz parte ou não da $PATHvariável é irrelevante. A presença da #!linha também é importante; sem ela, o script será executado pelo shell atual que você abriu. Se eu tiver um cshscript sem essa linha e tente executá-lo no bash com ./my_script.csh, ele falhará)
- Se o seu script estiver localizado no diretório que faz parte da sua
$PATHvariável, você poderá executá-lo apenas chamando o nome. Você pode chamar o chmodcomando na linha de comando apenas digitando seu nome porque está na /binpasta. /binsempre faz parte da $PATHvariável Nesse caso, as permissões executáveis e o local do script importam
- Especificando um intérprete como comando e script como argumento. Dessa forma, o script servirá como arquivo de entrada para o intérprete.
- Fornecendo um arquivo. O
. filename.shou source filename.shvai fazer o script ser tratado como se fosse a entrada do teclado, ou seja, como se fosse digitado na linha de comando diretamente. Nesse caso, permissões executáveis e localização não importam
Exemplos
Exemplo # 1, executando com intérprete, para permissões de exec
$-> 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, executando com ./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, executando 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 define a pasta de formulário que faz parte da $PATHvariável
# /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
.shcomo uma extensão é considerado, em muitas circunstâncias, uma prática inadequada: é contrário a como outros comandos são nomeados (você não executals.elf), geralmente é enganoso (se vocêfoo.shcomeçar com#!/bin/bash, então a execuçãosh foo.shexecutará com um intérprete diferente do que foi criado para ) e, se você reescreverfoo.shpara ser um programa Python, usar essa extensão significa escolher entre manter o nome agora enganoso e reescrever todos os programas que o chamam.