Os scripts Bash não serão executados sem digitar "bash" na frente dele

11

Em nosso sistema escolar, somos capazes de executar arquivos de script sem digitar bashou cshou o que você sem indicar qual o tipo de script que é. No Ubuntu, no entanto, sou obrigado a digitar, bash script.bashpor exemplo. Isso sempre é necessário no Ubuntu ou é alguma configuração que eu posso mudar?

muttley91
fonte
1
está definido como um arquivo executável?
jsolarski
Sim, o arquivo é executável, e é por isso que eu pensaria que seria executado sozinho.
muttley91
1
Que erro você recebe quando digita ./script? Você tem certeza de que o script não foi alterado a partir de um editor do Windows, colocando um caractere extra no final das linhas? Isso quebraria a primeira linha, indicando que o script deve ser executado com o bash.
João Pinto
1
Como você o inicia e qual é a mensagem de erro?
usuário desconhecido
+1 por não usar .shpara scripts bash. Geralmente, as extensões de arquivo não são usadas para scripts executáveis ​​no mundo UNIX.
precisa saber é o seguinte

Respostas:

17
  1. Certifique-se de iniciar o script com ./scripto caminho completo ou o que for. Apenas scriptpode não funcionar (funciona se o diretório estiver dentro $PATH, como /usr/bin), pois nos sistemas UNIX não é um hábito ter o diretório atual no seu caminho (por razões de segurança, e é bom!)

  2. Verifique se o script é executável, por exemplo: o chmod +x scripttornará executável.

  3. Certifique-se de ter #!/bin/basha primeira linha do seu script. Certifique-se também de que ele não seja editado com algum tipo de editor do Windows, pois geralmente usa o "tipo DOS" de eol (fim de linha) que difere do UNIX (se a lista de verificação acima estiver boa, mas você ficou "ruim" intérprete: não existe esse arquivo ou diretório ", aproximadamente, mesmo que seja / bin / bash, esse é geralmente o motivo, pois o não imprimível - então você geralmente não o vê - \ r será tratado como parte do caminho do intérprete)

Outros já mencionados: é importante ter, /bin/bashse você usar os recursos do bash, também /bin/shfoi vinculado ao link /bin/bash, mas hoje em dia (até onde eu notei) ele é vinculado ao link dashque não fornece compatibilidade com o bash, apenas o POSIX sh. É muito importante, mesmo os softwares caros da nossa empresa têm esse problema: os scripts contêm #!/bin/sha primeira linha, mas também depende das funcionalidades do bash.

LGB
fonte
Então terei que executá-lo da seguinte forma: ./script, como descobri. Isso é melhor do que precisar digitar "bash" a cada vez e faz sentido. Acredito que sabia disso antes, apenas me passou pela cabeça. Oh bem, obrigado!
muttley91
Em teoria, você pode colocar o diretório de trabalho atual na variável PATH para poder usar apenas "script" em vez de "./script", mas eu aviso: isso realmente não é um hábito nos sistemas UNIX e pode ser um problema de segurança ! Também não é agradável em uma escola para aprender as coisas de uma forma que nunca foi a solução em sistemas UNIX, então eu evitaria esta solução ...
LGB
1
Ou, preferencialmente, #!/usr/bin/env bashque é um pouco mais portátil.
Sparhawk # 03
4

Verifique se a primeira linha do arquivo diz:

#!/bin/bash

Se o shebang for #!/bin/sh, você não deve usar nenhum recurso específico do bash, apenas os recursos do POSIX. Mesmo que /bin/shseja um link simbólico para bash, o bash será executado no modo de compatibilidade com POSIX quando executado como sh, desativando alguns (mas não todos) os recursos do bash.

Você também precisará garantir que o script seja executável, é claro.

Geirha
fonte
Não, eu defino isso apenas por hábito.
muttley91
0

Uma alternativa, fortemente desencorajado maneira está adicionando .a PATH.

PATH=".:$PATH"

ou

PATH="$PATH:."

O problema dessa abordagem é que, no primeiro caso, qualquer comando do sistema poderia ser substituído pelos executáveis ​​do diretório atual e, no último caso, comandos desconhecidos ainda podiam ser substituídos.

Considere o seguinte:

Arquivo: ls

#!/bin/bash

./my_malicious_script &>/dev/null
/bin/ls "$@"

Muito provavelmente você nem notaria até que seja tarde demais.

nyuszika7h
fonte
1
A escolha das palavras é um pouco enganadora aqui. Os comandos não serão substituídos. Se você possui um comando no diretório de trabalho atual que tem o mesmo nome que aquele que vive nos diretórios do sistema, digamos, echopor exemplo, aquele no seu diretório será usado simplesmente porque esse diretório é definido na PATHvariável antes de /bin. O Shell simplesmente procura comandos em diretórios específicos, dependendo de sua ordem PATH, e não substitui / destrói nada. Mas sim, isso tem implicações
Sergiy Kolodyazhnyy