Diferentes maneiras de executar binários e scripts

11

Estou usando o Linux há algum tempo e tenho procurado uma visão completa disso, mas não encontrei nenhuma.

Eu simplesmente não entendo as diferentes maneiras de executar scripts e binários - é tudo uma grande bagunça para mim e eu tenho que usar tentativa e erro para determinar o que devo usar. Para um arquivo que é um script ou um binário <script/binary>, posso apresentar as seguintes alternativas:

<script/binary>
. <script/binary>
./<script/binary>
source <script/binary>
sh <script/binary>

(Há mais?)

Alguém pode fornecer uma visão geral completa de quais comandos funcionam com quais tipos de arquivos e qual é a diferença quando existem várias opções?

Obrigado.

Carl
fonte

Respostas:

7

Os seguintes comandos são os mesmos, um componente de ponto significa "diretório atual". Para permitir a execução, os arquivos precisam ter permissões executáveis:

path/to/binary
./path/to/binary

Observe que, se um caminho não contiver uma barra, ele será tratado como um comando (um shell interno ou um programa pesquisado na $PATHvariável de ambiente).

Os seguintes são quase os mesmos: eles executam um script de shell (não um binário!) No ambiente atual do shell. Uma pequena diferença entre as duas linhas encontram-se descritos nesta questão Unix.SE .

. path/to/script
source path/to/script

Finalmente você mencionou sh script. Novamente, isso funciona apenas para scripts de shell e não para binários. Você está basicamente executando o shprograma com o nome do script como argumento. No caso de sh, apenas trata esse argumento como shell script e o executa.

Para respostas restritas a shellscripts, consulte Diferentes maneiras de executar um shell script .

Lekensteyn
fonte
3

Obrigado por toda a entrada. Vou tentar responder minha própria pergunta agora e fornecer um guia completo para as diferentes possibilidades de executar scripts e binários. Edite e comente e poderemos criar algo que esteja completo e correto. Aqui está a minha sugestão:

A princípio, dois pontos a serem declarados:

  • O Linux faz uma distinção entre um comando e um caminho . Um comando é digitado apenas como está no prompt e executará um built-in ou fará com que o Linux procure por um binário ou um script correspondente no $ PATH.

  • Para o Linux interpretar algo como um caminho, ele precisa conter pelo menos uma barra (/). Por exemplo ./myScript, em , ./pode parecer bastante redundante - existe apenas para fazer o Linux interpretá-lo como um caminho e não como um comando.

Portanto, as opções para executar um binário ou um script:

Executando um binário binary:

$ binary          # when 'binary' is on the PATH, or is a built-in
$ ./binary        # when 'binary' is not on the path but in the current directory
$ /home/me/binary # when 'binary' is not on the PATH, and not in the current dir

Executando um script script:

O arquivo precisará ter permissões de execução, a menos que seja especificado o contrário.

$ script        # execute a script that is on PATH. Will be executed in a new shell.
                # The interpreter to use is determined by the she-bang in the file.
$ ./script      # execute a script that is in the current dir. Otherwise as above.
$ /a/dir/script # when the script is not on the PATH and not in current dir. 
                # Otherwise as above.
$ . script      # execute a script in the current dir. Will be executed in the
                # current shell environment.
$ source script # equivalent to the above *1
$ sh script     # executes 'script' in a new shell *2 (the same goes for 'bash ...',
                # 'zsh ...' etc.). Execute permission not neccessary.

Sobre she-bangs :

Os scripts com um she-bang (por exemplo #!/bin/sh) na primeira linha informam qual intérprete usar.

  • Este intérprete será usado quando executado por ./scriptou usando um comando: script( scriptdeve estar no PATH)
  • Usar sh scriptignorará o she-bang e usará, neste caso, shcomo intérprete
  • Usando . scriptou sourcevai ignorar a ela-bang e usar o interpretador atual (desde .ou sourceé equivalente a apenas a execução de cada linha do script no shell atual)

Notas de rodapé

* 1: Isso é quase verdade. No bash, eles são realmente o mesmo comando, mas, quando usado source, scriptserá pesquisado em $ PATH antes do diretório atual. Isso é básico, mas em shells somente POSIX, sourcenão funciona, mas .funciona. Então, use o último para portabilidade.

* 2: o que realmente acontece é que executamos o sh binário com 'script' como argumento, o que fará com que 'sh' execute 'script' em seu novo shell

Carl
fonte
2

Aqui está uma lista rápida de comandos. Observe que, quando menciono PATH, quero dizer os diretórios que contêm programas que o sistema conhece; você encontra aqueles com echo $PATH, e será algo como:/home/mike/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Scripts

  • Para executar um script no diretório de trabalho atual, use ./myscript.sh
  • Para executar um script em outro arquivo, use (se estiver no diretório de trabalho atual), ./myscript.sh textfile.txt
  • Os scripts também podem ser executados com argumentos; conforme explicado em Rute (p. 68): myfile.sh dogs cats birdsserá exibido The first argument is: dogs, second argument is: cats, third argument is: birdsporque o conteúdo deste script após o shebang é:echo "The first argument is: $1, second argument is: $2, third argument is: $3"

  • Para executar um script em outro diretório, use ~/Scripts/dogs.sh

  • Para executar um script que o sistema conhece porque está na sua pasta bin no diretório inicial (apenas crie-o se não estiver lá, pois ele será adicionado automaticamente ao seu CAMINHO), basta usar scriptname
  • Para executar um script que você instalou, basta usar seu nome, pois ele será conhecido pelo sistema: por exemplo, get_iplayer

Binários

  • Para executar um binário que o sistema conhece porque está em $ PATH, use o nome do programa e quaisquer parâmetros, por exemplo, vlc <stream url to open>
  • Para testar um binário que você compilou antes de instalar em / usr / local / bin ou para manter um programa independente longe do sistema, use ~/<folder>/app/myprog

fonte
Obrigado pela informação. Esta declaração está correta: Para executar um script ou binário que não esteja no PATH, basta especificar seu caminho. O motivo ./ é necessário para um script no caminho atual é que apenas 'script.sh' seria interpretado como um comando, pois não possui pelo menos uma barra /.
Carl
"Para executar um script que você instalou", o que é um script que eu "instalei"? Este ponto diz o mesmo que o ponto anterior?
Carl
@ Carl- seu primeiro comentário está correto, mas não é verdade dizer que meus dois últimos pontos sobre scripts são os mesmos. No ponto 5 da seção de script, eu estava falando sobre scripts que o usuário adicionou manualmente à pasta bin no diretório inicial; no ponto 6, eu estava falando de scripts como o get_iplayer que eles instalaram a partir dos repositórios e, como tal, sempre vão para as pastas do sistema, não para o diretório inicial do usuário.
Desculpe, mas ainda não entendo isso, um script em ~ / bin / (que está no PATH) ou em uma pasta do sistema (que está no PATH) - como pode haver uma diferença entre eles? Eles se comportam de maneira diferente?
Carl
Eu estava apenas fazendo uma distinção entre os scripts que o usuário possui e adiciona ao ~ / bin e os que pertencem à raiz nas pastas do sistema.