LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: rainfly

&&和()共同使用的疑问

[复制链接]
发表于 2008-12-31 10:45:40 | 显示全部楼层
就单单这句话而言,书中没有说错,但是表达得很差劲:只说“会执行最后一条命令”,但没说“echo ...”那段会不会被执行,于是这里很模棱两可。
正确的表述应该是:
在上面的例子中,如果只使用了命令分隔符而没有把它们组合在一起,POSIX shell总是会执行最后一个命令(exit)。

另外,楼上说得没错。实际上,(){}根本不是同一类字符:前者是元字符,后者是保留字。保留字必须处于

  • 行首
  • ;”后面

才能被识别(当然,空白字符总是被忽略的)。

另外,建议换本书学POSIX shell。
回复 支持 反对

使用道具 举报

发表于 2008-12-31 10:47:00 | 显示全部楼层
Post by rainfly;1932097
不是的
即使我执行 ca || echo "hello"; echo "ok"
ca不存在,我是故意让||前的命令执行失败的,
但是||后的语句还是都执行了!还是会输出
ca: command not found
hello
ok

————————
可见 echo "hello"; echo "ok" 都执行了,而不像书中所说只执行最后一句!


command not found和执行失败是两码事,后者的意思是 exit(1).
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-31 10:53:48 | 显示全部楼层
Post by 茶飯不思;1932101
什么书...好乱 根本看不明白...会误导人的
用";"只是把命令组合在一起 然后按顺序运行

在"()"中的命令是在subshell中运行
在"{}"中的是在当前shell运行(注意要在最后的命令后面加上";" 这书没说)
这都没错 可是后面的命令有点乱
按理"()"中的命令是在subshell运行 那么最后的exit就多余了




哦-_-书里说的和你说的恰好相反,书的说的是
"()"中的命令是在当前shell中运行
"{}"中的命令是在子shell中运行
回复 支持 反对

使用道具 举报

发表于 2008-12-31 10:56:46 | 显示全部楼层
@Xorcerer:
你说的那是无关大体的细节:由谁返回的错误码。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-31 11:00:33 | 显示全部楼层
Post by Jockey;1932103
书中没有说错,但是表达得很差劲:只说“会执行最后一条命令”,但没说“echo ...”那段会不会被执行,于是这里很模棱两可。
正确的表述应该是:


另外,楼上说得没错。实际上,(){}根本不是同一类字符:前者是元字符,后者是保留字。保留字必须处于
  • 行首
  • ;”后面

才能被识别(当然,空白字符总是被忽略的)。

另外,建议换本书学POSIX shell。



ls && echo "hello"; echo "ok"   即使没有"()",两个echo也都会被执行
但是   一个执行失败的命令 || echo "hello"; echo "ok" 如果没有"()",那么不执行hello,只执行后面的ok
对吗?
回复 支持 反对

使用道具 举报

发表于 2008-12-31 11:01:42 | 显示全部楼层
Post by rainfly;1932110
哦-_-书里说的和你说的恰好相反,书的说的是
"()"中的命令是在当前shell中运行
"{}"中的命令是在子shell中运行
这点书上是错的,所以你应该换书。
  1. $ ( cd /etc; pwd ); pwd
  2. /etc
  3. /Users/jockey
复制代码
  1. $ { cd /etc; pwd; }; pwd
  2. /etc
  3. /etc
复制代码
回复 支持 反对

使用道具 举报

发表于 2008-12-31 11:03:58 | 显示全部楼层
Post by rainfly;1932114
ls && echo "hello"; echo "ok"   即使没有"()",两个echo也都会被执行
但是   一个执行失败的命令 || echo "hello"; echo "ok" 如果没有"()",那么不执行hello,只执行后面的ok
对吗?
第一个不完善,第二个不对。
看起来,你并没有接受过正统的程序设计训练,不过没关系,建议搜索网络:“短路求值”。

recipe in POSIX shell:&& || ; 都是从左到右的执行顺序连接[color="Red"]命令或者命令组,不过...

  • &&总是找到一个执行失败的命令才罢休;
  • ||总是找到一个执行成功的命令才罢休;
  • ;小朋友从不计较这些。

理解了短路求值,分组不分组完全是次要问题。
回复 支持 反对

使用道具 举报

发表于 2008-12-31 11:04:12 | 显示全部楼层
Post by rainfly;1932097
不是的
即使我执行 ca || echo "hello"; echo "ok"
ca不存在,我是故意让||前的命令执行失败的,
但是||后的语句还是都执行了!还是会输出
ca: command not found
hello
ok

————————
可见 echo "hello"; echo "ok" 都执行了,而不像书中所说只执行最后一句!


本来这些操作符就是这样运行, 要是像那书那样说的运行才有问题

其实unix/Linux的书的质量都是一般, 经过翻译后就有可能变得乱
毕竟译者不一定都是用心的翻译
或者试试这本吧, 在朋友那看过几页, 像我这样的newbie觉得挺好的
<<Learning the bash Shell: Unix Shell Programming>>
回复 支持 反对

使用道具 举报

发表于 2008-12-31 11:30:04 | 显示全部楼层
Post by rainfly;1932100

能不能请你推荐一本英文shell的书呢?

我是跟 OReilly 的 "Learning The Bash Shell" 学的,然后写程序时看 bash 的 manual page 就行了。
听说有本书叫 ABS, 好像不错,没看过。
最近在睡前常翻 "Shell Scripting Recipes", 也不错,适合已经入门的人
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-31 11:57:28 | 显示全部楼层
谢谢各位
找到Learning the bash Shell, 3rd Edition 了
^_^

好好学习!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表