Назад | Перейти на главную страницу

Почему я не могу записать вывод интерфейса командной строки AWS EC2 в Bash?

Я пытаюсь зафиксировать вывод aws ec2 delete-snapshot в команде сценария Bash, но я не могу получить ничего для записи вывода. я пытался result=$(command), result=`command` и т.д., но когда я пытаюсь повторить эхо $result там ничего нет.

Вот пример вывода.

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

Мне нужно автоматизировать создание и удаление снимков, но я не могу записать результат.

Кто-нибудь еще сталкивался с этой проблемой?

В > только оператор перенаправляет stdout ("стандартный вывод") или "дескриптор файла 1". Сообщения об ошибках обычно печатаются в другом дескрипторе файла, 2, stderr, ("стандартная ошибка"). На экране вашего терминала вы видите оба stdout и stderr.

В > оператор на самом деле больше просто ярлык для 1>, и снова только перенаправляет stdout. В 2> оператор похож на 1> но вместо перенаправления stdout, это перенаправляет 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$

Итак, чтобы перенаправить оба stdout и stderr в тот же файл, используйте >file 2>&1.

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

Это говорит: "перенаправить эхо stderr к /dev/null, и перенаправить stdout в 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$ 

В современном Bash вы также можете использовать &> чтобы перенаправить оба потока в один и тот же файл:

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

Поэтому для вас, в частности, используйте:

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

Или

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

Вывод ошибки будет записан в stderrне stdout, и вы только перенаправляете stdout. Если вы хотите запечатлеть stderr также вам нужно добавить 2>&1, например:

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

Если вы хотите зафиксировать в переменной как stdout, так и stderr, попробуйте:

RESULT="$(aws ec2 delete-snapshot --snapshot-id vid --output json 2>&1)"

if ! [[ $RESULT =~ "Successfully deleted snapshot" ]]; then
  echo "ERROR while deleting snapshot"
  echo "$RESULT"
  exit 1
fi

...