Como eu leio a saída de comandos em um script

4

Estou aprendendo scripts do Linux no momento, e uma coisa que consigo trabalhar é atribuir uma saída de comando a uma variável. O comando service httpd configtest retorna Syntax is OK , então eu escrevi isso.

#!/bin/bash

var='service httpd configtest'
echo "Output is $var"

Pelo que eu li, deve armazenar a saída em var e, em seguida, ecoá-la. No entanto, a saída quando eu executo esse script é

Syntax OK
Output is

O que eu fiz de errado? Estou usando o CentOS 6.5 se isso faz diferença.

    
por TMH 04.04.2014 / 17:34

3 respostas

7

Quando você executa service httpd configtest , ele realmente executa o comando apachectl configtest :

  ....
  apachectl=/usr/sbin/apachectl  
  ....
  graceful|help|configtest|fullstatus)
        $apachectl $@
        RETVAL=$?
        ;;
  ....

Faça um strace :

$ strace -f -e trace=write apachectl configtest
Process 22999 attached (waiting for parent)
Process 22999 resumed (parent 22998 ready)
[pid 22999] write(1, "1024\n", 5)       = 5
Process 22999 detached
--- SIGCHLD (Child exited) @ 0 (0) ---
Process 23000 attached (waiting for parent)
Process 23000 resumed (parent 22998 ready)
Process 22998 suspended
[pid 23000] write(2, "Syntax OK\n", 10Syntax OK
) = 10
Process 22998 resumed
Process 23000 detached
--- SIGCHLD (Child exited) @ 0 (0) ---

Você pode ver que a saída Syntax OK é gravada em stderr , faz com que a saída não possa salvar na variável var .

Você pode fazê-lo, redirecionando stderr para stdout :

var=$(service httpd configtest 2>&1)
    
por 04.04.2014 / 18:17
5

Meu palpite é que service httpd configtest está gerando stderr em vez de stdout . Você poderia tentar:

var=$(service httpd configtest 2>&1)
echo "Output is $var"

Ou mesmo isso, sem a variável:

echo -n "Output is "
service httpd configtest 2>&1

A opção -n para eco suprime a nova linha no final, para que a saída de service httpd configtest esteja na mesma linha.

Observe também que troquei os backticks ( '...' ) por $(...) acima, pois os backticks podem causar alguns problemas e são geralmente considerados obsoletos. Veja Qual é a diferença entre $ (stuff) e 'stuff'? para mais informações.

Para obter mais informações sobre o que é stdout e stderr e qual 2>&1 , confira as páginas da Wikipédia em padrão Transmissões e Redirecionamento .

    
por 04.04.2014 / 18:12
2

A variável var contém códigos de escape ANSI que fazem com que aumente a linha.

Sua saída pode ser reproduzida com o seguinte exemplo:

var=$'3[FSyntax OK\n'
echo "Output is $var"

Isso produz:

Syntax OK
Output is

onde a primeira linha sobrescreve o prompt do qual o script (contendo as duas linhas acima foi iniciado).

    
por 04.04.2014 / 17:49