não pode fazer com que scripts sejam executados em uma VM Minimal (+ LXDE) de Lubuntu (Xenial) com shebangs

2

Eu me envergonhei um pouco aqui com um simples erro de digitação e uma profunda ignorância. Poupe algum pesar:

  1. seus hasbangs / shebangs sempre devem ter um / , como #!/bin/bash
  2. seja preciso
  3. 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.
  4. seja grato. Existem pessoas muito úteis aqui.
  5. 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)?
  6. 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.
  7. 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.)

    
por j doe will do just fine 16.12.2017 / 13:51

1 resposta

4

Seu hash bang deve começar com a barra frontal em avanço /

#!bin/bash quase certamente não é um caminho de diretório / arquivo válido e deve ser #!/bin/bash

Se não tiver certeza de que existe um shell, você sempre pode usar ls ou algo assim para garantir que o caminho esteja correto, ou uma maneira mais portátil de escrevê-lo seria:

#!/usr/bin/env bash

Isso fará com que o sistema procure automaticamente o caminho de bash (ou qualquer interpretador que você escolher) via env e use o primeiro que encontrar.

    
por 16.12.2017 / 13:54