shell - tutorial - write linux scripts




Como echo shell comandos como eles são executados? (10)

A resposta de Shuckc para ecoar linhas de seleção tem algumas desvantagens: você acaba com o seguinte comando set +x sendo ecoado, e você perde a capacidade de testar o código de saída com $? já que é sobrescrito pelo set +x .

Outra opção é executar o comando em um subshell:

echo "getting URL..."
( set -x ; curl -s --fail $URL -o $OUTFILE )

if [ $? -eq 0 ] ; then
    echo "curl failed"
    exit 1
fi

que lhe dará saída como:

getting URL...
+ curl -s --fail http://example.com/missing -o /tmp/example
curl failed

Isso gera a sobrecarga de criar um novo subshell para o comando.

Em um script de shell, como faço para ecoar todos os comandos do shell chamados e expandir qualquer nome de variável? Por exemplo, dada a seguinte linha:

ls $DIRNAME

Eu gostaria que o script executasse o comando e exibisse o seguinte

ls /full/path/to/some/dir

O objetivo é salvar um log de todos os comandos do shell chamados e seus argumentos. Talvez haja uma maneira melhor de gerar tal log aa?


Alguém acima postou:

#!/bin/bash
#function to display commands
exe() { echo "\$ [email protected]" ; "[email protected]" ; }

e isso parece promissor, mas não posso, para minha vida, descobrir o que ele faz. Eu pesquisei e procurei na página bash do homem por "\ $" e "$ @", e não encontrei absolutamente nada .

Eu entendo que uma função está sendo criada, chamada "exec ()". Eu entendo que as chaves indicam o início e o fim da função. Acho que entendo que o ponto-e-vírgula marca um "retorno difícil" entre um comando de várias linhas, de modo que "{echo" \ $ $ @ "; "$ @"; } se torna, em essência:

{
echo "\$ [email protected]"
"[email protected]"

}

Alguém pode me dar uma breve explicação, ou onde encontrar essa informação, já que obviamente o meu google-fu está falhando comigo?

(Sem querer iniciar uma nova questão em um tópico antigo, meu objetivo é redirecionar a saída para um arquivo. O método "set -x; [commands]; set + x" funcionaria adequadamente para mim, mas eu posso " Para descobrir como fazer o eco dos resultados para um arquivo em vez da tela, eu estava tentando entender esse outro método na esperança de que eu pudesse usar uma compreensão muito pobre do redirecionamento / pipes / tee / etc para fazer a mesma coisa.

Obrigado!

EDITAR MAIS TARDE:

Com alguns ajustes, acredito que descobri. Aqui está o meu código equivalente para o que eu preciso:

SCRIPT_LOG="\home\buddy\logfile.txt"
exe () {
  params="[email protected]"                       # Put all of the command-line into "params"
  printf "%s\t$params" "$(date)" >> "$SCRIPT_LOG"   # Print the command to the log file
  $params                           # Execute the command
}

exe rm -rf /Library/LaunchAgents/offendingfile
exe rm -rf /Library/LaunchAgents/secondoffendingfile

Os resultados no logfile.txt são parecidos com:

Tue Jun  7 16:59:57 CDT 2016  rm -rf /Library/LaunchAgents/offendingfile
Tue Jun  7 16:59:57 CDT 2016  rm -rf /Library/LaunchAgents/secondoffendingfile

Apenas o que eu precisava. Obrigado!


Digite "bash -x" na linha de comando antes do nome do script bash. Por exemplo, para executar o foo.sh, digite:

bash -x foo.sh

Eu uso uma função para echo, em seguida, execute o comando

#!/bin/bash
#function to display commands
exe() { echo "\$ [email protected]" ; "[email protected]" ; }

exe echo hello world

Quais saídas

$ echo hello world
hello world

Editar:

Para comandos de comandos mais complicados, etc, você pode usar o eval:

#!/bin/bash
#function to display commands
exe() { echo "\$ ${@/eval/}" ; "[email protected]" ; }

exe eval "echo 'Hello World' | cut -d ' ' -f1"

Quais saídas

$  echo 'Hello World' | cut -d ' ' -f1
Hello

Para csh e tcsh , você pode set verbose ou set echo (ou você pode até definir ambos, mas isso pode resultar em alguma duplicação na maior parte do tempo).

A opção verbose imprime praticamente a expressão de shell exata que você digita.

A opção echo é mais indicativa do que será executado através da desova.

http://www.tcsh.org/tcsh.html/Special_shell_variables.html#verbose

http://www.tcsh.org/tcsh.html/Special_shell_variables.html#echo

Special shell variables

verbose If set, causes the words of each command to be printed, after history substitution (if any). Set by the -v command line option.

echo If set, each command with its arguments is echoed just before it is executed. For non-builtin commands all expansions occur before echoing. Builtin commands are echoed before command and filename substitution, because these substitutions are then done selectively. Set by the -x command line option.


Para permitir que os comandos compostos sejam ecoados, eu uso eval mais a função exe de Soth para fazer o eco e depois executar o comando. Isso é útil para comandos canalizados que, de outra forma, só mostrariam nenhum ou apenas a parte inicial do comando canalizado.

Sem eval:

exe() { echo "\$ [email protected]" ; "[email protected]" ; }
exe ls -F | grep *.txt

Saídas:

$
file.txt

Com eval:

exe() { echo "\$ [email protected]" ; "[email protected]" ; }
exe eval 'ls -F | grep *.txt'

Quais saídas

$ exe eval 'ls -F | grep *.txt'
file.txt

Você pode executar um script bash no modo de depuração com a opção -x .
Isso irá ecoar todos os comandos.

bash -x example_script.sh

# Console output
+ cd /home/user
+ mv text.txt mytext.txt


Você também pode salvar a opção -x no script . Apenas especifique a opção -x no shebang.

######## example_script.sh ###################
#!/bin/bash -x

cd /home/user
mv text.txt mytext.txt

##############################################

./example_script.sh

# Console output
+ cd /home/user
+ mv text.txt mytext.txt




Você também pode alternar isso para selecionar linhas em seu script, agrupando-as em set -x e set +x por exemplo.

#!/bin/bash
...
if [[ ! -e $OUT_FILE ]];
then
   echo "grabbing $URL"
   set -x
   curl --fail --noproxy $SERV -s -S $URL -o $OUT_FILE
   set +x
fi

set -x ou set -o xtrace expande as variáveis ​​e imprime um pequeno sinal + antes da linha.

set -v ou set -o verbose não expande as variáveis ​​antes de imprimir.

Use set +x e set +v para desativar as configurações acima.

Na primeira linha do script, pode-se colocar #!/bin/sh -x (ou -v ) para ter o mesmo efeito que set -x (ou -v ) mais tarde no script.

O acima também funciona com /bin/sh .

http://www.faqs.org/docs/abs/HTML/options.html

$ cat shl
#!/bin/bash                                                                     

DIR=/tmp/so
ls $DIR

$ bash -x shl 
+ DIR=/tmp/so
+ ls /tmp/so
$

$ cat exampleScript.sh
#!/bin/bash
name="karthik";
echo $name;

bash -x exampleScript.sh

A saída é a seguinte:





shell