免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: woodie
打印 上一主题 下一主题

[shell问答录]:命令、进程、子shell... [复制链接]

论坛徽章:
0
21 [报告]
发表于 2006-04-30 07:49 |只看该作者
同意waker的意见。进程分两部分,一个是运行的环境,一个是CPU执行的指令。关于脚本,其执行的指令应该是解释器。只不过这个解释器比较强大,可以动态生成CPU的指令。

论坛徽章:
0
22 [报告]
发表于 2006-06-11 09:28 |只看该作者
very good.

论坛徽章:
0
23 [报告]
发表于 2006-06-11 11:15 |只看该作者
值得学习,收藏,谢谢!

论坛徽章:
0
24 [报告]
发表于 2006-06-12 05:38 |只看该作者
原帖由 woodie 于 2006-4-20 20:07 发表
所以,我认为赋值可以作为命令这一点应该没有问题,至于是否是内部命令则可以商榷。不过就其表现,把它归入builtin命令一类,也无太大不妥。 ...


One or more variable assignments can start a simple command or can be arguments to some special built-in commands.


原帖由 woodie 于 2006-4-20 19:38 发表
...
* shell脚本可以不在首行指定解释器,缺省的解释器/bin/sh会被用来解释、执行它。这一点你说的是对的,....


r u sure?


原帖由 woodie 于 2006-4-21 15:12 发表
... T3.脚本在实际应用中不能作为系统进程调度的一个基本单元,那么认为它可以作为进程又有何益处呢?


Most of the time, you like to "kill" the script.


原帖由 大蚂蚁 于 2006-4-22 03:21 发表
..
但是,我还有个疑问:eval属于build in还是?


builtin command


原帖由 r2007 于 2006-4-20 21:46 发表
可以看出var=val,在不同的上下文中有不同的解释。如果单独出现则是普通的赋值语句,如果有其他命令,则是用来定义环境变量的,且不影响当前的环境。  ...


Acutally, environment variables are a big topic.  For example, do you think the following two lines
can be the same:

    echo a=1 b
    a=1 echo b

[ 本帖最后由 Cygnus 于 2006-6-12 08:30 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
25 [报告]
发表于 2006-06-12 15:40 |只看该作者
To Cygnus:
这个帖子讨论的问题的确比较复杂,欢迎Cygnus兄加入。^_^
>>* shell脚本可以不在首行指定解释器,缺省的解释器/bin/sh会被用来解释、执行它。这一点你说的是对的,....
>r u sure?
很多资料上是这样说的。不过可能是大多因袭了前人的说法吧,这并不完全准确。当内核不能用"shebang"(#!/path/shell)执行一个脚本时,尝试找到一个合适的interpreter的任务就落到当前shell的头上。这时缺省的解释器是什么呢?这就取决与不同的shell实现了。在我的linux box上ash和pdksh会调用/bin/sh,但你知道在linux下这通常是/bin/bash的一个符号链接,实际上调用的是bash;bash会派生自身的子shell来执行脚本;而zshell会调用不带绝对路径的sh,这当然最终仍会调用/bin/bash。总体来看,Bourne兼容的shell,如ash/pdksh/bash/zsh,都可能会调用Bourne shell或者某个Bourne兼容的shell。
至于c shell或兼容的tcsh则处理不同。如果脚本的第一行的第一个字符是#,csh会用c shell来解释执行脚本;如果首字符是:或任意非#的字符,他会试图调用Bourne shell来解释它,在我的平台下,tcsh会调用/bin/sh。
其它的平台是否类似呢,可惜我没有条件测试。

>>... T3.脚本在实际应用中不能作为系统进程调度的一个基本单元,那么认为它可以作为进程又有何益处呢?
>Most of the time, you like to "kill" the script.
I am not a butcher. I don't *like* killing. ^_^

[ 本帖最后由 woodie 于 2006-6-12 17:44 编辑 ]

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
26 [报告]
发表于 2006-06-12 16:24 |只看该作者
原帖由 Cygnus 于 2006-6-12 05:38 发表


Acutally, environment variables are a big topic.  For example, do you think the following two lines
can be the same:

    echo a=1 b
    a=1 echo b

确实var=val这种形式在有其它命令时并不一定就是设置环境变量的意思。
请看我原文中的例子,明显是放在命令前面的,不至于让人产生误解吧。
这样的例子也不止echo a=1 b这一个。
printf a=1
awk -v a=1 '{print a,$0}'
ls a=1
等等,var=val的形式都是命令参数,一眼就可以看出这些形式是不在当时的讨论范畴之内的。
Cygnus是在挑字眼吧^_^。不过还是感谢指正。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
27 [报告]
发表于 2006-06-12 16:32 |只看该作者
>    echo a=1 b
>    a=1 echo b
在bash中,它们一样不一样取决于你的喜好

  1. [waker@proxy dd3]$ a=1 echo b
  2. b
  3. [waker@proxy dd3]$ echo a=1 b
  4. b
  5. [waker@proxy dd3]$ echo a=1 b
  6. a=1 b
  7. [waker@proxy dd3]$ a=1 echo b
  8. b
复制代码

两种结果都是可以得到的

关于shabang也是月经讨论了吧?
在unixfaq中有些讨论,英文比较牛逼的话可以当小说一读(俺宁愿去风月大陆看看)
http://www.faqs.org/faqs/unix-faq/faq/part3/section-16.html

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
28 [报告]
发表于 2006-06-12 16:38 |只看该作者
记得哪个牛逼的书里还介绍过一个强制使用sh的保险套

  1. #!/bin/sh
  2. export $PATH||/bin/sh $0 argv:g
复制代码

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
29 [报告]
发表于 2006-06-12 17:15 |只看该作者
原帖由 waker 于 2006-6-12 16:32 发表
[waker@proxy dd3]$ echo a=1 b
b
[waker@proxy dd3]$ echo a=1 b
a=1 b

请教:第一种情况是如何实现的?有什么特别的设置吗?

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
30 [报告]
发表于 2006-06-12 17:27 |只看该作者

  1.        If  the -k option is set (see the set builtin command below), then all
  2.        parameter assignments are placed in the environment for a command, not
  3.        just those that precede the command name.
复制代码


ksh也有这个选项
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP