![为什么我无法在 Bash 中捕获 AWS EC2 CLI 输出?](https://linux22.com/image/658091/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E6%97%A0%E6%B3%95%E5%9C%A8%20Bash%20%E4%B8%AD%E6%8D%95%E8%8E%B7%20AWS%20EC2%20CLI%20%E8%BE%93%E5%87%BA%EF%BC%9F.png)
我正在尝试捕获 Bash 脚本命令中的输出aws ec2 delete-snapshot
,但我无法获取任何内容来捕获输出。我尝试过等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:~#
我需要自动创建和删除快照,但我无法捕获输出。
还有其他人遇到过这个问题吗?
答案1
操作>
符仅重定向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
答案2
错误输出将写入stderr
,而不是stdout
,并且您只是重定向stdout
。如果您还想捕获stderr
,则需要添加2>&1
,例如:
aws ec2 delete-snapshot --snapshot-id vid --output json >test 2>&1
答案3
如果您想在变量中捕获 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
...
答案4
当我尝试将 ACW CLI 输出插入变量时,我也遇到了这个问题。我为解决这个问题所做的是:
token=$(aws <command> | jq -r '.NextToken')
echo $token