免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 10690 | 回复: 43
打印 上一主题 下一主题

if条件语句中ls core和ls core>dev/null有何不同 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-15 22:02 |只看该作者 |倒序浏览
10可用积分
判断是否存在core文件,shell中直接用ls core
但用if `ls core`,shell始终认为条件为假
后来使用if `ls core > /dev/null`,
判断正常无误
请问高手为何有这等差别?
明明ls core和ls core> /dev/null返回值相同,却为何在if中表现不一?
if难道不是根据``中的语句返回值来作为条件?

最佳答案

查看完整内容

关键在于`command`的返值。简单地说,`command`的返值是最后执行命令的返值。`command`展开的结果(命令替换的结果)为非空(准确地讲,展开并经shell解释后有字)时,把第一个字,如firstword,当作命令解释并执行,最后执行的命令是firstword。`command`的真假与firstword的真假相同。`command`展开的结果为空时,最后执行的命令是command。`command`的真假与command的真假相同。当存在文件core时, `ls core` 展开的结果为core,再执 ...

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
2 [报告]
发表于 2009-09-15 22:02 |只看该作者
关键在于`command`的返值。

简单地说,`command`的返值是最后执行命令的返值。
`command`展开的结果(命令替换的结果)为非空(准确地讲,展开并经shell解释后有字)时,把第一个字,如firstword,当作命令解释并执行,最后执行的命令是firstword。`command`的真假与firstword的真假相同。

`command`展开的结果为空时,最后执行的命令是command。`command`的真假与command的真假相同。


当存在文件core时,
    `ls core` 展开的结果为core,再执行core,不存在这个命令,core的执行结果为假。所以`ls core`的返值为假。
    `ls core >  /dev/null`的展开结果为空, 最后执行的命令是ls core >  /dev/null, 它的返值为真。所以`ls core >
    /dev/null`的返值为真。
当不存在文件core时,
    `ls core` 展开的结果为空,最后执行的命令为ls core, 它的返值为假。所以`ls core`的返值为假。
    `ls core >  /dev/null`的展开结果为空, 最后执行的命令是ls core >  /dev/null, 它的返值为假。所以`ls core >
    /dev/null`的返值为假。

可见"存在core"与`ls core>/dev/null/`的真假相同。

[ 本帖最后由 blackold 于 2009-9-16 09:30 编辑 ]

论坛徽章:
3
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:19
3 [报告]
发表于 2009-09-15 22:27 |只看该作者
因为你直接ls core 会有一个返回值,shell会把它当成命令解释,结果core又不是一个命令所以返回一个假值!不知道说明白没有

论坛徽章:
3
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:19
4 [报告]
发表于 2009-09-15 22:30 |只看该作者
$ ls

ls

$ if `ls ls` ;then echo 223;else echo 11;fi
ls
223

论坛徽章:
0
5 [报告]
发表于 2009-09-15 22:32 |只看该作者

回复 #2 MYSQLER 的帖子

但是
  if `ls core> /dev/null`
中ls core> /dev/null也不是命令啊,为何这个就可以根据是否有core名字的文件,而作出有效判断?
请指教.

论坛徽章:
3
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:19
6 [报告]
发表于 2009-09-15 22:38 |只看该作者
原帖由 chep 于 2009-9-15 22:32 发表
但是
  if `ls core> /dev/null`
中ls core> /dev/null也不是命令啊,为何这个就可以根据是否有core名字的文件,而作出有效判断?
请指教.



再看:

  1. 当一个目录下没有core时

  2. ~/test$ ls core >/dev/null
  3. ls: cannot access core: No such file or directory

  4. 返回值为假
  5. ~/test$ echo $?
  6. 2

  7. 当touch一个core后

  8. ~/test$ touch core
  9. ~/test$ ls core >/dev/null
  10. 现在返回值为真
  11. ~/test$ echo $?
  12. 0
复制代码

论坛徽章:
0
7 [报告]
发表于 2009-09-15 23:02 |只看该作者
和返回值无关!
`` 是替换标准输出而已而已
不要弄混哦;返回值是程序结束之后返回的
ls core 始终为假不应该这样说
要看ls core 输出什么到 标准输出stdout

[ 本帖最后由 nuclearxin 于 2009-9-16 16:40 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-09-15 23:04 |只看该作者
ls core和ls core>dev/null 的不同就是
强制 条件为假
哈哈

论坛徽章:
0
9 [报告]
发表于 2009-09-15 23:24 |只看该作者

回复 #7 nuclearxin 的帖子

偶更迷惑了.
感觉是不应该和返回值有关.
SMS:~> ls -l core
ls: core: No such file or directory
SMS:~> echo $?
1
SMS:~> ls -l core > /dev/null
ls: core: No such file or directory
SMS:~> echo $?
1
SMS:~> touch core
SMS:~> ls -l core
-rw-r--r--    1 aisms    aisoft          0 2009-09-15 23:09 core
SMS:~> echo $?
0
SMS:~> ls -l core > /dev/null
SMS:~> echo $?
0
但是如果按替换的话,ls -l > /dev/null不管有无core文件,全都是空啊,其实ls -l > /dev/null 2>&1也是同样的.
那么if如何通过这个条件来做判断呢?

论坛徽章:
0
10 [报告]
发表于 2009-09-15 23:32 |只看该作者
原帖由 chep 于 2009-9-15 23:24 发表
偶更迷惑了.
感觉是不应该和返回值有关.
SMS:~> ls -l core
ls: core: No such file or directory
SMS:~> echo $?
1
SMS:~> ls -l core > /dev/null
ls: core: No such file or directory
SMS:~> echo  ...

if要和test来配合就非常简单了
比如你这个
test就是[
if [ -f core ];then
xxxxxxx
fi
-f 等选项具体参照man test
这里的也是是file
也可以用e就是存在
man test很清楚
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP