Por que não consigo capturar a saída do AWS EC2 CLI no Bash?

4

Estou tentando capturar a saída de um aws ec2 delete-snapshot em um comando de script Bash, mas não consigo obter nada para capturar a saída. Eu tentei result=$(command) , result='command' etc. mas quando tento ecoar $result não há nada lá.

Aqui está um exemplo de saída.

root@host:~# aws ec2 delete-snapshot --snapshot-id vid --output json>test

A client error (InvalidParameterValue) occurred when calling the DeleteSnapshot operation: Value (vid) for parameter snapshotId is invalid. Expected: 'snap-...'.
root@host:~# aws ec2 delete-snapshot --snapshot-id vid>test

A client error (InvalidParameterValue) occurred when calling the DeleteSnapshot operation: Value (vid) for parameter snapshotId is invalid. Expected: 'snap-...'.
root@host:~# cat test
root@host:~# testing=$(aws ec2 delete-snapshot --snapshot-id vid)

A client error (InvalidParameterValue) occurred when calling the DeleteSnapshot operation: Value (vid) for parameter snapshotId is invalid. Expected: 'snap-...'.
root@host:~# echo $testing

root@host:~#

Eu preciso automatizar a criação e a exclusão de instantâneos, mas não consigo capturar a saída.

Alguém mais se deparou com este problema?

    
por JoshZ 12.05.2015 / 07:36

2 respostas

6

O operador > apenas redireciona stdout ("saída padrão") ou "descritor de arquivo 1 ". Mensagens de erro geralmente são impressas em um descritor de arquivo diferente, 2 , stderr , ("erro padrão"). Na tela do seu terminal, você vê os dois stdout e stderr .

O operador > é realmente mais um atalho para 1> e, novamente, redireciona apenas stdout . O operador 2> é semelhante a 1> , mas em vez de redirecionar stdout , ele redireciona stderr .

user@host$ echo hello world >/dev/null
user@host$ echo hello world 1>/dev/null
user@host$ echo hello world 2>/dev/null
hello world
user@host$

Portanto, para redirecionar os arquivos stdout e stderr para o mesmo arquivo, use >file 2>&1 .

user@host$ echo hi 2>/dev/null 1>&2
user@host$

Isso diz: "redirecione o stderr para /dev/null do echo e redirecione stdout para stderr.

user@host$ curl --invalid-option-show-me-errors >/dev/null
curl: option --invalid-option-show-me-errors: is unknown
try 'curl --help' or 'curl --manual' for more information

user@host$ curl --invalid-option-show-me-errors 2>/dev/null
user@host$ 
user@host$ curl --invalid-option-show-me-errors >/dev/null 2>&1
user@host$ 

No Bash moderno, você também pode usar &> para redirecionar os dois fluxos para o mesmo arquivo:

user@host$ curl --invalid-option-show-me-errors &>/dev/null
user@host$ 

Então, para você, especificamente, use:

aws ec2 delete-snapshot --snapshot-id vid --output json >test 2>&1

Ou

aws ec2 delete-snapshot --snapshot-id vid --output json &>test
    
por 12.05.2015 / 09:50
5

A saída de erro será gravada em stderr , não em stdout , e você estará redirecionando apenas stdout . Se você quiser capturar stderr , precisará adicionar 2>&1 , por exemplo:

aws ec2 delete-snapshot --snapshot-id vid --output json >test 2>&1
    
por 12.05.2015 / 08:38