Eu me envergonhei um pouco aqui com um simples erro de digitação e uma profunda ignorância. Poupe algum pesar:
- seus hasbangs / shebangs sempre devem ter um
/
, como #!/bin/bash
- seja preciso
- se você estiver trabalhando entre o host e o computador convidado (virtual) sem copiar e colar ativado, basta parar. Os erros de digitação vão matar seu código e sua pergunta (o que pode desabilitar as pessoas). Descobrir como copiar e colar, ou trabalhar a partir de uma única máquina. Recodificar manualmente é loucura.
- seja grato. Existem pessoas muito úteis aqui.
- eles são todos linux, mas diferentes distros podem ter idiossincrasias quando se trata de shells e scripts. (Isso inclui versões completas e mínimas da distro). Verifique seu shell (
ps -p$$ -ocmd=
funcionou para mim fonte ). Você precisa criar diretórios manualmente (especialmente em distribuições mínimas)?
- para mim, porque é mais aplicável à maioria dos sistemas (por exemplo, "portáteis"), vou iniciar meus scripts com
#!/usr/bin/env <SHELL>
, onde SHELL é bash
, sh
ou o que for. Muitos sites de instruções parecem dizer "sempre inicie seu script com #!/bin/bash
" sem nenhuma explicação ou advertência. Apenas não é verdade.
-
Shellcheck . Essa ferramenta pode ser bastante útil. (Crédito - roaima )
Não consigo executar scripts em uma VM Minimal (+ LXDE) Lubuntu (Xenial) com shebangs - sem isso, eles estão bem.
Seguindo o conselho em um post anterior , eu fiz um script bem simples, em 4 versões que diferem apenas no shebang:
echotest (sem linha de shebang):
#blantantly simple test to figure out script problems
echo "this is working - type something for me to repeat it"
read input
echo $input
echotest-bin-bash
#!bin/bash
#blantantly simple test to figure out script problems
echo "this is working - type something for me to repeat it"
read input
echo $input
e mais dois, correspondendo a #!bin/dash
e [EDIT: inseridos "bin" no seguinte, neste texto não o script] #!bin/sh
.
Esses arquivos são salvos em ~/bin
, um diretório que eu criei manualmente depois de ler um fórum em algum lugar.
Testar os scripts a partir daí produz:
x@computer:~$ echotest
this is working - type something for me to repeat it
test1
test1
i.e. funciona sem qualquer shebang, mas
x@computer:~$ echotest-bin-bash
bash: /home/x/bin/echotest-bin-bash: bin/bash: bad interpreter: No such file or directory
x@computer:~$ echotest-bin-dash
bash: /home/x/bin/echotest-bin-dash: bin/bash: bad interpreter: No such file or directory
x@computer:~$ echotest-bin-sh
bash: /home/x/bin/echotest-bin-sh: bin/sh: bad interpreter: No such file or directory
Além disso,
x@computer:~$ ./echotest-bin-bash
bash: ./echotest-bin-bash: No such file or directory
Para testar outra recomendação que li em um fórum / blog, removi os scripts de ~/bin
e os testei em /usr/local/bin
.
x@computer:~$ echotest
bash: /home/x/bin/echotest: No such file or directory
E o mesmo para todas as outras variantes.
No entanto,
x@computer:~$ sudo /usr/local/bin/echotest
this is working - type something for me to repeat it
test
test
(isto é, funciona)
x@computer:~$ sudo /usr/local/bin/echotest-bin-bash
sudo: unable to execute /usr/local/bin/echotest-bin-bash: No such file or directory
Hangup
Observe que todas as permissões foram concedidas com chmod +x <filename>
ou mais raramente, chmod 777 <filename>
e duplamente marcada com ls -l /rele/vant/directory
.
x@computer:~$ echo $PATH
/home/x/bin:/home/x/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Em resposta a uma resposta anterior em minha primeira tentativa nesta questão, o Lubuntu Minimal mostra estas instâncias:
||/ Name Version Architecture Description
+++-==============-============-============-=================================
ii dash 0.5.8-2.1ubu amd64 POSIX-compliant shell
ii bash 4.3-14ubuntu amd64 GNU Bourne Again SHell
Usando comandos que não entendo completamente, adquiridos em fóruns:
x@computer:~$ file "$(type -P bash)" 2>/dev/null
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=[redacted for the forum], stripped
x@computer:~$ type -p bash
/bin/bash
Murphy, se você estiver lendo - não tenho sorte em tentar chamar bin / bash, recebendo um aviso. Eu não sei como e meus termos de pesquisa trazem muito material fora do alvo.
Por fim, testei o script de funcionamento (ou seja, sem o shebang), em um arquivo .desktop, e ele funcionava perfeitamente ( Exec=echotest
).
Por que os shebangs não funcionam? Scripts equivalentes com o #!bin/bash
funcionam bem no meu host Ubuntu Mate (Xenial).
Estou certo de que este é um erro muito básico, mas estou perplexo. Este é o meu segundo roteiro, por isso estou feliz em ser direcionado para materiais básicos relevantes.
Obrigado antecipadamente
Editar
Obrigado Jesse_b.
Edit1.1 - não, eu estou errado. #! / bin / bash funciona. Eu pesquisei o histórico do terminal e não consigo encontrar a entrada a que me referi anteriormente.
Além disso, #!/usr/bin/env bash
funciona perfeitamente.
Editar 2
Obrigado Murphy
Usar hashbang #!/bin/sh
e #!/bin/bash
funciona bem.
Além disso
x@computer:~$ ls -l /bin/bash
-rwxr-xr-x 1 root root 1037528 May 16 2017 /bin/bash
x@computer:~$ /usr/bin/env | grep bash
SHELL=/bin/bash
x@computer::~$ ls -l /bin/*sh
-rwxr-xr-x 1 root root 1037528 May 16 2017 /bin/bash
-rwxr-xr-x 1 root root 154072 Feb 17 2016 /bin/dash
lrwxrwxrwx 1 root root 4 May 16 2017 /bin/rbash -> bash
lrwxrwxrwx 1 root root 4 Feb 17 2016 /bin/sh -> dash
Uma edição final - diferentes distros serão mais ou menos rígidas em como seus hashbangs / shebangs são formatados. Eu encontrei este post em que alguém descreve semelhante problemas com versões anteriores do Mint / Xfce e Lubuntu / LXDE.
(Eu tive problemas quando eu re-escrevi manualmente um script no meu host Ubuntu Mate em um convidado Lubuntu Minimal / LXDE. Eu pensei ter observado um comportamento diferente entre distros, mas a) eu não entendi o significado do formato shebang, b) existem sites que oferecem conselhos talvez não tão bons, ec) estou propenso a erros de digitação. Como uma experiência, veja se o seu script funcionará sem a shebang.)