¿Por qué no puedo capturar la salida de la CLI de AWS EC2 en Bash?

Pregunta:

Estoy tratando de capturar la salida de una aws ec2 delete-snapshot en un comando de script Bash, pero no puedo obtener nada para capturar la salida. He intentado result=$(command) , result=`command` etc. pero cuando intento hacer eco de $result no hay nada allí.

Aquí hay un resultado de ejemplo.

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:~#

Necesito automatizar la creación y eliminación de instantáneas, pero no puedo capturar la salida.

¿Alguien más se ha encontrado con este problema?

Respuesta:

El operador > solo redirige stdout ("salida estándar") o "descriptor de archivo 1 ". Los mensajes de error generalmente se imprimen en un descriptor de archivo diferente, 2 , stderr , ("error estándar"). En la pantalla de su terminal, está viendo stdout y stderr .

El operador > es en realidad más solo un atajo para 1> , y nuevamente, solo redirige stdout . El operador 2> es similar a 1> pero en lugar de redirigir stdout , redirige 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$

Entonces, para redirigir tanto stdout como stderr al mismo archivo, use >file 2>&1 .

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

Esto dice, "redirigir el stderr de echo a /dev/null , y redirigir stdout a 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$ 

En Bash moderno, también puede usar &> para redirigir ambas transmisiones al mismo archivo:

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

Entonces, para ti, específicamente, usa:

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

O

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

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım