免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1972 | 回复: 7

( )和{ }的区别---一个问题 [复制链接]

论坛徽章:
0
发表于 2005-03-17 12:08 |显示全部楼层
在 shell command line 中,一般人或許不太計較 ( ) 與 { } 這兩對符號的差異,
雖然兩者都可將多個命令作群組化處理,但若從技術細節上,卻是很不一樣的:
( ) 將 command group 置於 sub-shell 去執行,也稱 nested sub-shell。
{ } 則是在同一個 shell 內完成,也稱為 non-named command group。
若,你對上一章的 fork 與 source 的概念還記得了的話,那就不難理解兩者的差異了。
要是在 command group 中扯上變量及其他環境的修改,我們可以根據不同的需求來使用 ( ) 或 { } 。
通常而言,若所作的修改是臨時的,且不想影響原有或以後的設定,那我們就 nested sub-shell ,
反之,則用 non-named command group
摘: http://bbs.chinaunix.net/forum/viewtopic.php?p=1595135#1595135

在bash下执行
[root@tmp  tmp]# echo $$;(echo $$)
28494
28494
为什么进程号会一样? 

论坛徽章:
0
发表于 2005-03-17 13:09 |显示全部楼层

( )和{ }的区别---一个问题

了解,谢谢!!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2005-03-17 13:33 |显示全部楼层

( )和{ }的区别---一个问题

原帖由 "xzcsiwh"]  tmp 发表:
# echo $$;(echo $$)
28494
28494
为什么进程号会一样? 

你搜索一下 nested subshell ?
記得之前有討論過, 不過好像不在13問裡而是在別的貼子.
我一時找不到, 你自己找找看?

论坛徽章:
0
发表于 2005-03-17 14:27 |显示全部楼层

( )和{ }的区别---一个问题

是这一篇吧
http://bbs.chinaunix.net/forum/24/20040906/401274.html

摘录原贴的结论:

  1.  $: Expands to the process ID of the shell. In a ( ) subshell, it expands to the process ID of the current shell, not the subshell.

  2. 所以说,正常情况下$$表示的是当前进程的ID号,但是如果用的(),则
  3. $$表示的是调用该命令的shell的ID。
复制代码


原贴还讨论到subshell 和nested subshell的参数继承问题,也很受教

  1. 1. subshell 继承

  2. * The current directory
  3. * Environment variables
  4. * Standard input, output, and error plus any other open file descriptors
  5. * Any characteristics defined in the environment file
  6. * Signals that are ignored

  7. 2. subshell 不继承

  8. * Shell variables, except environment variables and those defined in the environment file
  9. * Handling of signals that are not ignored

  10. 3. nested subshell 和一般 subshell 完全一样, 除了它继承父 shell
  11. 的 Shell variables 以外。
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2005-03-17 15:10 |显示全部楼层

( )和{ }的区别---一个问题

test.sh

  1. echo $$
复制代码

比较这两种不同的执行方式
1:
sh test.sh
2:
. ./test.sh

论坛徽章:
0
发表于 2005-03-17 15:33 |显示全部楼层

( )和{ }的区别---一个问题

1:
sh test.sh
显示fork子进程的进程号
2:
. ./test.sh
没有fork,显示当前进程号

论坛徽章:
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
发表于 2005-03-17 15:51 |显示全部楼层

( )和{ }的区别---一个问题

俺认为不能完全解释

  1. [waker@www waker]$ cat shlv.sh     
  2. #!/bin/bash
  3. echo $SHLVL
  4. [waker@www waker]$ echo $SHLVL     
  5. 1
  6. [waker@www waker]$ ( echo $SHLVL )
  7. 1
  8. [waker@www waker]$ ./shlv.sh
  9. 2
复制代码

看起来并不是只有$$受影响

论坛徽章:
0
发表于 2005-03-17 19:52 |显示全部楼层

( )和{ }的区别---一个问题

楼上的例子不矛盾啊。
( echo $SHLVL )是nested subshell 中运行的,会继承父 shell
的 Shell variables,所有为1

./shlv.sh 是在fork中运行的,SHLVL应在父shell环境的基础上加1
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP