首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用'sh -c‘时,bash diff返回0

使用'sh -c‘时,bash diff返回0
EN

Stack Overflow用户
提问于 2019-05-06 10:04:16
回答 1查看 195关注 0票数 1

我正在尝试比较一些文件,并做一些不同的事情。但是当与sh -c结合使用时,diff不能返回正确的退出代码。

代码语言:javascript
运行
复制
root@i-qqixe8m2:~# cat /tmp/1
1
root@i-qqixe8m2:~# cat /tmp/2
2
root@i-qqixe8m2:~# set +x # Edited: useless cmd. But still kept here since answer below by @iBug would refer to this.
root@i-qqixe8m2:~# sh -c "diff /tmp/1 /tmp/2; echo $?;"
1c1
< 1
---
> 2
0
root@i-qqixe8m2:~# diff /tmp/1 /tmp/2; echo $?;
1c1
< 1
---
> 2
1
root@i-qqixe8m2:~#

PS。我在这里发现了相关的问题:git diff and bash return code,但没有提供任何理由,下面的评论我认为不是真正正确的解决方案,因为我在这里不使用git。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-06 10:16:20

因为您使用的是双引号,所以您当前的shell已经扩展了$?,而不是sh

代码语言:javascript
运行
复制
sh -c "diff /tmp/1 /tmp/2; echo $?;"

sh看到的是第二个命令是echo 0 (最后一个命令set +x返回0)。

要修复此问题,请使用单引号来防止当前$?展开,以便sh可以正确处理:

代码语言:javascript
运行
复制
sh -c 'diff /tmp/1 /tmp/2; echo $?;'

或者干脆逃脱美元:

代码语言:javascript
运行
复制
sh -c "diff /tmp/1 /tmp/2; echo \$?;"

使用set -x调试外壳命令是一个很好的做法,我不确定为什么要使用+x

代码语言:javascript
运行
复制
~ $ sh -c 'diff 1 2; echo $?;'
+ sh -c 'diff 1 2; echo $?;'
1c1
< 1
---
> 2
1
~ $ sh -c "diff 1 2; echo $?;"
+ sh -c 'diff 1 2; echo 0;'
1c1
< 1
---
> 2
0
~ $

请注意以+开头的两行代码,这是您的shell实际执行的代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55997989

复制
相关文章

相似问题

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