Я пытаюсь зафиксировать вывод 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
...