`
诗意的栖居
  • 浏览: 274450 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

shell 小括号的问题

 
阅读更多
http://www.linuxsir.org/bbs/thread345055.html


shell中的小括号()可以把命令放在子shell中执行,如下:

$var=hello
$(var=hellotest; echo $var)
$hellotest
$echo $var
$hello

说明在子shell中的局部环境变量对父shell不影响

现在运行
$var=hello
$(echo $var) // 子shell只能继承export导出的变量,var=hello是局部变量不会被子shell继承!这里是在子shell中执行的吧?!,下面就不应该显示hello
$hello
$
怎么没有在shell中给var赋值就引用了父shell中的变量了呢?
按照前面的说法:()小括号中的命令在子shell中执行,那么应该是下面才对啊
$var=hello
$(echo $var)
$
$echo $var
$hello

谁解释下,谢谢了


shell确实有很多看似不符合常理的情况,但是manpage里全部交代清楚了!

代码:
       Command  substitution, commands grouped with parentheses, and asynchro-
       nous commands are invoked in a subshell environment that is a duplicate
       of  the  shell  environment,  except that traps caught by the shell are
       reset to the values that the shell inherited from its parent at invoca-
       tion.  Builtin commands that are invoked as part of a pipeline are also
       executed in a subshell environment.  Changes made to the subshell envi-
       ronment cannot affect the shell's execution environment.shell environment 里到底包括了些什么?往上翻阅manpage!

代码:
       The shell has an execution environment, which consists of  the  follow-
       ing:

       o      open  files inherited by the shell at invocation, as modified by
              redirections supplied to the exec builtin

       o      the current working directory as set by cd, pushd, or  popd,  or
              inherited by the shell at invocation

       o      the  file  creation  mode mask as set by umask or inherited from
              the shell's parent

       o      current traps set by trap

       o      shell parameters that are set by variable assignment or with set
              or inherited from the shell's parent in the environment

       o      shell  functions  defined during execution or inherited from the
              shell's parent in the environment

       o      options enabled at invocation (either by default  or  with  com-
              mand-line arguments) or by set

       o      options enabled by shopt

       o      shell aliases defined with alias

       o      various  process  IDs,  including  those of background jobs, the
              value of $$, and the value of $PPID


通过变量赋值的shell参数会成为shell环境的一部分,而通过圆括号创建的子shell所处的环境是父shell环境的一个副本。

也就是说,圆括号创建的子shell,与你直接 bash -c 'do some thing' 创建的子shell环境确实是有些不同的!



(do something) 创建的是子shell;
bash -c 'do something' 创建的也是子shell;
./script.sh 创建的也是子shell;etc。
但是完全复制了父shell环境的就三种情况:
command substitution,命令替换,也就是$(do something);
commands grouped with parentheses,圆括号中的命令组,也就是(do something);
asynchronous commands,异步命令,这个我貌似还没遭遇过... XD




知道$$这个shell参数么?扩展为当前shell的进程号。它是shell环境的一部分,但是不会被子进程继承(怎么可能继承?子进程也是进程,也有自己的进程号!)不过如果子shell中该值没有改变,只有一种解释:子shell复制了父shell的环境。

代码:
$ echo $$
2500
$ (echo $$)
2500
$ echo $(echo $$)
2500
$为什么都是2500?

接着再来:

代码:
$ bash -c 'echo $$'
2530
$ bash
$ echo $$
2531
$ exit
$ echo 'echo $$' | bash
2541
$ cat > script.sh
echo $$
$ bash script.sh
2545
$
分享到:
评论

相关推荐

    一文读懂 Shell 中各种括号的作用.doc

    本文将详细介绍 Shell 中各种括号的作用,包括小括号、双小括号、中括号、双中括号和大括号等。 一、小括号() 小括号的主要作用是用于命令组和命令替换。命令组的作用是将多个命令组合在一起,形成一个新的命令...

    shell 脚本各种括号的用途.docx

    - **命令组**:单小括号内的命令会在一个新的子shell环境中按顺序执行。这意味着括号内的任何变量修改都不会影响到父shell或脚本的其他部分。括号中的命令可以通过分号进行分隔,最后一个命令后的分号可省略,且括号...

    shell中各种括号的作用详解()、(())、[]、[[]]、{}(推荐)

    在Shell脚本编程中,括号有着特殊的意义和作用,主要分为五种类型:小括号()、双小括号(())、中括号([])、双中括号([[]])以及大括号({})。下面将详细介绍每一种括号的作用。 1. **小括号()** - 命令组:圆...

    shell脚本语言.pdf

    * ash:ash shell 是由 Kenneth Almquist 编写的, Linux 中占用系统资源最少的一个小 shell,它只包含 24 个内部命令。 * csh:csh 是 Linux 比较大的内核,它由以 William Joy 为代表的共计 47 位作者编成,共有 ...

    SHELL编程常用手册

    - 区分大小写。 - 弱类型,即变量的类型由赋给它的值决定。 变量赋值有两种主要方式: 1. 直接赋值,如`a="hello"`。 2. 使用`read`命令从标准输入读取值,如`read a`。 变量引用格式为`$变量名`或`${变量名}`。...

    shell经典教程 .TXT shell经典教程

    ### Shell经典教程知识点总结 #### 一、Shell简介与学习目的 **Shell**是一种用于与计算机操作系统进行交互的命令行接口。本教程主要介绍的是**Bash(Bourne Again Shell)**,它是Linux中最常用的Shell之一。在...

    LINUX与UNIX Shell

    命令执行顺序章节则涉及了如何使用逻辑运算符&&和||以及括号()和花括号{}来将多个命令组合在一起,控制命令的执行顺序和条件。 第二部分专注于文本过滤技术,包括正则表达式介绍和grep命令家族。正则表达式章节中...

    shell script学习

    例如,在创建子shell时,任何在这个小括号内创建的变量都是局部变量,只存在于当前小括号的上下文中。双小括号"(( ))"用于算术运算,它允许进行算术运算和数值测试,并支持变量自增自减等操作。单中括号"[]"用于条件...

    shell编程中级实例

    Shell编程是一种在Linux和Unix操作系统中广泛...这些实例涵盖了Shell编程的核心概念,通过它们你可以更好地理解和应用Shell脚本解决实际问题。学习和熟练掌握这些知识点将极大地提升你在Linux或Unix系统中的工作效率。

    shell扫盲篇:Shell常见知识

    - **`[abc]`**:匹配括号内的任何一个字符,如`a`、`b`或`c`。 - **`[a-n]`**:匹配字符范围内的任何一个字符,如`a`到`n`之间的任何一个字符。 #### 五、判断文件的属性 在Shell中,可以使用`test`命令或`[`来...

    AIX-SHELL基本编程

    在定义环境变量时,需要注意三个重要问题:第一,在等号 (=) 的两边不能有空格,否则将导致错误。第二个要注意的事是,当定义的环境变量值多于一个字时,引号是必须的。第三,虽然通常可以用双引号来替代单引号,但...

    shell正则表达式.zip

    在IT领域,尤其是在Linux系统管理和自动化脚本编写中,Shell正则表达式(Regular Expression,简称regex)扮演着至关重要的角色。它是一种模式匹配工具,能够有效地搜索、查找、替换和解析文本。在这个名为"shell...

    Shell十三问-ChinaUnix精华贴整理

    6. 小括号(())与大括号({})的差别:小括号用来创建子Shell来执行命令,而大括号用来将一系列命令作为单一命令组执行。 7. $(())、$()与${}的差别:$(())用于算术运算,$()用于命令替换,而${}用于变量扩展和...

    shell 笔记

    17. 子shell:用括号`()`创建一个子shell,如`(command)`。 18. `read`命令:用于从标准输入读取字符或数据,`-n`指定读取字符数,`-s`不显示输入,`-p`设置提示信息,`-t`设定等待输入的超时时间,`-d`指定结束...

    包含了几乎所有 unix shell script编程特性的 unix shell script 完整项目, 基于 IBM AIX,附注释.rar

    一直很喜欢写unix shell script, 因为写那么一点点东西可以有那么多效果,投入小,产出大,爽啊. 在写IBM AIX K Shell script时,感觉不那么友好,主要是有一些格式细节要求比较严格,不太习惯,后来写惯了也就好了,下面的...

    shell脚本大全

    5. 函数:Shell脚本中可以定义函数,以将脚本划分为更小、更可管理的部分。函数通常以"function"关键字或直接使用函数名和一对圆括号定义。 6. 脚本的调试和优化:有效的脚本调试方法包括在命令行中逐步执行脚本、...

    linux-shell的函数式编程工具

    在Shell中,你可以通过`function`关键字或直接定义一个函数名后跟花括号来创建函数。例如: ```bash myFunction() { echo "Hello, World!" } myFunction ``` 这将定义并调用一个名为`myFunction`的函数,...

Global site tag (gtag.js) - Google Analytics