首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >shell脚本以一种奇怪的方式运行,但为什么呢?

shell脚本以一种奇怪的方式运行,但为什么呢?
EN

Stack Overflow用户
提问于 2022-04-26 12:23:00
回答 1查看 111关注 0票数 1

我试图在Fargate ECS任务(aws)上运行一个命令,并捕获它的退出代码。

在aws cli ecs执行命令子命令中有一个已知的错误,它阻止我从命令本身获取退出状态,而是返回aws cli会话管理器插件底层的退出状态,更多关于您可以读取这里的信息。

毕竟,为了获得退出状态,我正在用几种方式测试它,使用"ls -l“而不是我需要使用的原始命令。

这是我正在运行的命令(它运行在一个运行Ubuntu20.04的自我托管的Github运行器上):

代码语言:javascript
复制
unbuffer aws ecs execute-command \
  --region eu-west-1 \
  --cluster qa-devops-1-productname \
  --task b75a377a63f44938ae7bacc50c852723 \
  --container ops-machine \
  --command 'sh -c "ls -l /productname ; echo $?"' \
  --interactive > some.log
grep -vi session some.log | sed -e '/^$/d' | tail -1 

当我在终端上运行这个命令时,当我使用SSH连接到(自我托管的) Github实例时:

代码语言:javascript
复制
ubuntu@ip-10-16-12-250:~$ unbuffer aws ecs execute-command --region eu-west-1 --cluster qa-devops-1-productname --task b75a377a63f44938ae7bacc50c852723 --container ops-machine --command 'sh -c "ls -l /productname ; echo $?"' --interactive > some.log ; grep -vi session some.log | sed -e '/^$/d' | tail -1
0

正如您在上面的示例中所看到的,该命令成功地输出了退出状态。

接下来,我想将输出插入一个名为“result”的变量中:

代码语言:javascript
复制
ubuntu@ip-10-16-12-250:~$ result=$(unbuffer aws ecs execute-command --region eu-west-1 --cluster qa-devops-1-productname --task b75a377a63f44938ae7bacc50c852723 --container ops-machine --command 'sh -c "ls -l /productname ; echo $?"' --interactive > some.log ; grep -vi session some.log | sed -e '/^$/d' | tail -1)
ubuntu@ip-10-16-12-250:~$ echo $result
0

但是,当我将其放在脚本中并使用调试属性(bash -x)运行它时,请查看$result的内容:

代码语言:javascript
复制
ubuntu@ip-10-16-12-250:~$ ./1.sh
++ unbuffer aws ecs execute-command --region eu-west-1 --cluster qa-devops-1-productname --task b75a377a63f44938ae7bacc50c852723 --container ops-machine --command 'sh -c "ls -l /productname ; echo $?"' --interactive
++ tail -1
++ sed -e '/^$/d'
++ grep -vi session some.log
+ result=$'0\r'
 -ne 0 ]]
")syntax error: invalid arithmetic operator (error token is "
+ echo 'equals 0'
equals 0

由于某种原因,结果变量包含"$' 0 \r'“,而不是仅包含0。

也尝试过这样做:

代码语言:javascript
复制
ubuntu@ip-10-16-12-250:~$ ./1.sh
++ unbuffer aws ecs execute-command --region eu-west-1 --cluster qa-devops-1-productname --task b75a377a63f44938ae7bacc50c852723 --container ops-machine --command 'sh -c "ls -l /productname ; echo $?"' --interactive
++ tail -1
++ sed -e '/^$/d'
++ grep -vi session some.log
+ result=$'0\r'
++ grep -E '[0-9]{1,3}'
++ echo $'0\r'
 -ne 0 ]]
")syntax error: invalid arithmetic operator (error token is "
+ echo 'equals 0'
equals 0

那是什么原因呢?如何确保结果只包含正确的数字而没有其他内容?

EN

回答 1

Stack Overflow用户

发布于 2022-04-26 14:29:19

result声明为整数,并让bash为您完成以下工作:

代码语言:javascript
复制
> declare -i result
> result=$(unbuffer aws ecs execute-command --region eu-west-1 
             --cluster qa-devops-1-productname --task b75a377a63f44938ae7bacc50c852723
             --container ops-machine --command 'sh -c "ls -l /productname ; echo $?"'
             --interactive > some.log;
           grep -vi session some.log | sed -e '/^$/d' | tail -1)
> [ ${result -eq 0 ] && echo "Success" || echo "Failure"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72013893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档