为什么我无法在 Bash 中捕获 AWS EC2 CLI 输出?

为什么我无法在 Bash 中捕获 AWS EC2 CLI 输出?

我正在尝试捕获 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”。错误消息通常打印在不同的文件描述符上,2stderr,(“标准错误”)。在您的终端屏幕上,您会看到stdoutstderr

操作>符实际上更像是 的快捷方式1>,并且再次强调,它仅重定向stdout2>操作符类似于 ,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

相关内容