Eu me envergonhei um pouco aqui com um simples erro de digitação e uma profunda ignorância. Salve-se de alguma dor:
- seus hasbangs/shebangs devem sempre ter um líder
/
, como#!/bin/bash
- seja preciso
- se você estiver trabalhando entre a máquina host e a máquina convidada (virtual) sem copiar e colar ativado, apenas pare. Erros de digitação matarão seu código e sua pergunta (o que pode irritar as pessoas). Descubra como copiar e colar funcionando ou trabalhe em uma única máquina. Redigitar manualmente é loucura.
- seja grato. Existem pessoas realmente muito úteis aqui.
- eles são todos linux, mas distros diferentes 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 é o mais aplicável à maioria dos sistemas (ou seja, "portátil"), vou começar meus scripts com
#!/usr/bin/env <SHELL>
, onde SHELL ébash
,sh
ou qualquer outra coisa. 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 . Esta ferramenta pode ser bastante útil. (Crédito - roaima )
Não consigo executar scripts em uma VM Lubuntu (Xenial) Minimal (+ LXDE) com shebangs - sem, eles estão bem.
Seguindo conselho de um post anterior , fiz um script bem simples, em 4 versões que diferem apenas no shebang:
echotest (sem linha 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, correspondentes a #!bin/dash
e [EDIT: inserido "bin" a seguir, neste texto não no script] #!bin/sh
.
Esses arquivos são salvos em ~/bin
, um diretório que criei manualmente depois de ler um fórum em algum lugar.
Testar os scripts de lá produz:
x@computer:~$ echotest
this is working - type something for me to repeat it
test1
test1
ou seja, funciona sem nenhum 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
Mais longe,
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 ~/bin
e os experimentei enquanto salvos 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
(ou seja, 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 um chmod +x <filename>
ou mais raramente, chmod 777 <filename>
, e verificadas novamente 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 pergunta, o Lubuntu Minimal mostra estes instalados:
||/ 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, obtidos 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 tentando chamar bin/bash, recebendo um prompt. Não sei como e meus termos de pesquisa trazem muito material fora do alvo.
Por fim, testei o script funcionando (ou seja, sem o shebang), em um arquivo .desktop, e funcionou perfeitamente ( Exec=echotest
).
Por que os shebangs não funcionam? Scripts equivalentes #!bin/bash
funcionam bem no meu host Ubuntu Mate (Xenial).
Tenho certeza de que este é um erro muito básico, mas estou perplexo. Este é meu segundo roteiro, então estou feliz por ser direcionado para materiais básicos relevantes.
desde já, obrigado
Editar
Obrigado Jesse_b.
Edit1.1 - não, estou errado. #!/bin/bash funciona. Procurei no 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
Usando um hashbang #!/bin/sh
e #!/bin/bash
funciona muito bem.
Mais longe
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 distribuições serão mais ou menos rígidas em como seus hashbangs/shebangs são formatados. Encontrei esta postagem em que alguém descreve problemas semelhantes com versões anteriores do Mint/Xfce e Lubuntu/LXDE.
(Tive problemas quando redigitei manualmente um script em meu host Ubuntu Mate em um convidado Lubuntu Minimal/LXDE. Achei ter observado um comportamento diferente entre as distros, mas a) 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 experiência, veja se seu script funcionará sem problemas.)