Diferença entre sh -x e ./ para execução de script

5

Então eu tenho um script de shell simples. Qual é a diferença entre os dois comandos em execução? Existe uma maneira preferida?

$ sh -x foobar.sh

OR

$ ./foobar.sh

Eu achei o script executado mais devagar quando usado com o segundo comando.

    
por Gaurav Prabhu 04.05.2015 / 17:56

3 respostas

6

O arquivo ./foobar.sh é iniciado, executando-o com o que segue o #! na primeira linha. Se essa linha ler #!/bin/sh -x , ela será idêntica ao caso sh -x foobar.sh (supondo que sh foi resolvido para /bin/sh do PATH). Talvez não seja iniciado por sh mas bash ?

O sinalizador -x imprime informações de depuração, ou seja, todos os comandos antes de serem executados.

    
por 04.05.2015 / 18:17
3

Depende do conteúdo do shell script e do shell usado. Um script de shell pode conter código clichê , chamado de shebang, como segue:

#!/usr/bin/env bash

A sequência especial '#!' instrui a chamada do sistema kernel exec () para usar o programa definido logo após o interpretador. Isso significa que você terá que examinar o arquivo para ver qual programa será usado para executá-lo, se estiver usando seu segundo estilo de execução.

Além disso, no manual bash (bash -c "help set")

-x  Print commands and their arguments as they are executed.

O que seu comando deve estar fazendo - se você estiver usando bash, veja nota abaixo - é imprimir cada linha em seu script e executá-lo. Estranhamente, isso deve fazer com que o primeiro comando seja mais lento que o segundo, em vez do contrário (novamente: se o interpretador usado nos dois casos for o mesmo). É muito mais comum executar o shell sem o -x, a menos, claro, que você queira depurar.

Linha de fundo: por razões descritas aqui use o shebang com o programa env em (como recomendado aqui ) e use seu segundo estilo de execução. Essa é a maneira mais independente de fazer as coisas e é o caminho preferido.

Nota: Outra coisa que complica as coisas é que o intérprete real que está por trás de / bin / sh varia de sistema para sistema. Em muitos casos isso é realmente bash e é isso que eu assumi.

    
por 04.05.2015 / 18:38
1

A primeira versão, com uma chamada explícita para sh , executará seu script com sh (exibindo instruções de rastreio, conforme solicitado por -x ). O segundo, que não especifica um intérprete explícito, respeitará a linha shebang, se houver, ou usará como padrão o shell que você está executando no momento.

Por exemplo, se o seu script tiver uma linha shebang de #! /bin/bash , ou se seu shell for bash, o segundo formulário ./script fará com que a execução execute o bash em vez de sh. Como o bash é um shell com mais recursos que sh, ele pode ter diferentes características de desempenho.

    
por 04.05.2015 / 18:17