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