Por que alguns sistemas executam um .sh
arquivo apenas especificando o nome do arquivo sem extensão e outros requerem nome mais extensão? No meu caso, estou tentando escrever uma série de comandos seguindo estas instruções .
Estou especificando a extensão agora, mas ser capaz de executar os comandos sem .sh
seria preferível.
command-line
scripts
Philip Kirkbride
fonte
fonte
.sh
como 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.sh
começar com#!/bin/bash
, então a execuçãosh foo.sh
executará com um intérprete diferente do que foi criado para ) e, se você reescreverfoo.sh
para ser um programa Python, usar essa extensão significa escolher entre manter o nome agora enganoso e reescrever todos os programas que o chamam.+x
set - ondefoo.sh
é uma biblioteca que pode ser originada em qualquer shell POSIX,foo.bash
pode ser originada no bash,foo.ksh
no ksh, etc.Respostas:
Você está confuso. A
.sh
extensão é apenas uma dica para os seres humanos e não tem absolutamente nenhum efeito sobre como o sistema lida com o arquivo. O Unix / Linux não cometeu nenhumSecrets.pdf.exe
erro do Windows .Aqui está o que acontece quando você digita
foo
:Redirecionamento para
STDIN
,STDOUT
eSTDERR
são criados.O shell verifica sua tabela de hash interna para ver se já conhece uma
$PATH
entradafoo
. Se não houver, o shell pesquisará os diretórios$PATH
, procurando um arquivo chamadofoo
que tenha o bit Execute definido nas permissões de arquivo. Primeirasfoo
vitórias.Se os dois primeiros bytes do arquivo
foo
forem#!
, a próxima sequência será o nome de um intérprete a ser executado. Assim,#!/bin/bash
introduz um script Bash,#!/usr/bin/perl
introduz um script Perl, etc.Se o arquivo começar
\177ELF
, é um executável binário e old.so
inicia.Leia
man execve
eman ld.so
para uma explicação mais detalhada.fonte
chmod +x
) resolve isso, certo?x
tudo de maneira otimista ) e de onde veio o arquivo (qualquer processo com controle do diretório pode ser enganado para definir as permissões) . Então, isso mitiga , mas eu não diria que resolve .Secrets.pdf.exe
porque eu sempre desativar o estúpidohide file extension
recursoO 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
.sh
extensão para designar que um arquivo é um script de shell ou.py
para 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
Executando executáveis
Para executar o script, geralmente existem várias maneiras.
./my_script_name
. O.
diretório atual significa./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
$PATH
variá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 umcsh
script sem essa linha e tente executá-lo no bash com./my_script.csh
, ele falhará)$PATH
variável, você poderá executá-lo apenas chamando o nome. Você pode chamar ochmod
comando na linha de comando apenas digitando seu nome porque está na/bin
pasta./bin
sempre faz parte da$PATH
variável Nesse caso, as permissões executáveis e o local do script importam. filename.sh
ousource filename.sh
vai 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 importamExemplos
Exemplo # 1, executando com intérprete, para permissões de exec
Exemplo # 2, executando com
./
conjunto de permissões executáveis, conjunto de linhas shebang.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)
Exemplo # 4, executando o script que possui permissões executáveis define a pasta de formulário que faz parte da
$PATH
variávelO Exemplo 5, removendo a extensão, ainda é executado porque as extensões não importam, mas tem permissões e faz parte de
$PATH
:fonte
PATH
?man chmod
para ver como definir permissõesBoas explicações aqui já. Eu só queria acrescentar que, idealmente, você não deve usar extensões de arquivo para executáveis.
Geralmente, você precisa realizar algo relativamente fácil e começa com um pequeno script de shell. Com o tempo, você começa a adicionar cada vez mais funcionalidades ao seu script, até que chegue algum tempo que se torne impossível de manter ou você precise de alguma funcionalidade que não possa realizar facilmente com um shell script e pense em reescrever esse shell script em outro idioma (python , perl, ...?).
Reescrever do zero geralmente é considerado um erro, mas para scripts pode fazer sentido, porque geralmente eles não são tão grandes ou têm muitas funcionalidades. Mas vamos assumir que é possível reescrever do zero em alguma outra linguagem, mantendo a funcionalidade e os parâmetros / sinalizadores do script inicial do shell.
Os usuários desse script não precisam estar cientes dessa alteração de idioma, eles continuarão executando o mesmo comando e ele continuará funcionando.
Se seu script foi nomeado
do-something.sh
, ele pode continuar sendodo-something.sh
, mas agora está escrito em python (por exemplo) e, portanto, sua dica inicial agora é totalmente enganosa.fonte
Para executar arquivos sem uma extensão, você normalmente não precisa fazer muito, apenas certifique-se de ter (no caso de scripts bash) a linha shebang adequada na primeira linha:
você também precisa tornar o arquivo executável para o sistema
É o mesmo que usar
chmod +x yourfilename
os números que são fáceis de explicar.É um número triplo de octais adicionados, o primeiro número representa o usuário, o segundo para o grupo e o terceiro para outros, mais sobre o que você pode encontrar aqui .
E se você estiver no mesmo diretório que o seu script, não se esqueça de usar
./
assim:fonte
O sufixo .sh pode realmente atrapalhar, porque, para executá-lo, você deve digitar myscript.sh em vez de apenas myscript, o que não funcionará. É melhor chamá-lo de "myscript" sem o sufixo .sh, e um rápido uso do comando "file" dirá se é um executável binário (formato ELF no linux) ou um script de shell ou qualquer outro tipo de script.
O QDOS (sistema operacional rápido e sujo, que mais tarde foi renomeado para "DOS" pela IBM depois que a mirosoft o piratou e vendeu ilegalmente para eles) e outros ripoffs baratos do CP / M, incluindo janelas, misturam tudo isso porque nesses sistemas não há algo como executar permissões em arquivos. Isso resultou em incontáveis conflitos de segurança nos últimos 30 a 40 anos. Na verdade, há apenas alguns minutos, recebi vários e-mails indesejados com um arquivo zip com armadilha renomeada para MYPICTURE.JPG.zip :)
fonte