- 浏览: 274450 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
Xujian0000abcd:
说的太好啦~赞一个~
shell if语句中的并列 -
Jimmy.song:
终于在楼主这里找到答案,很受益,谢谢~
使用diff或者vimdiff比较远程文件(夹)与本地文件(夹)
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中的小括号()可以把命令放在子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 查找文件中包含中文的行
2012-08-15 14:32 2978awk '/[^!-~]/' file asscii码从!到 ... -
Linux Shell for循环写法总结
2012-07-05 15:48 2362关于shell中的for循环用法很多,一直想总结一下,今天网上 ... -
Linux Shell删除两个文件相同部分
2012-07-04 11:22 2351转来的,原址http://www.cnblogs.com/ra ... -
保留字符串中的数字,其它全去掉
2012-03-15 11:26 3603把2007.10.30 16:00:00去掉".&q ... -
sed 用法解释
2011-10-28 14:29 10021.Sed命令 调用sed命令有 ... -
df 和 du 命令详解
2011-09-27 14:59 999df命令详细用法 a:显 ... -
shell tr命令的使用
2011-09-15 10:30 44728tr是translate的简写,亦 ... -
Useful Shell Option – extglob 和 shopt命令
2011-09-14 10:45 3411Bash Shell有个extglob选项 ... -
source命令
2011-09-06 16:45 1275source [filename] 不再产 ... -
Bash 自带的字符截断功能
2011-09-02 15:51 1183如果是一般路径的字符截断可以用basename和dirname ... -
Du命令功能说明
2011-08-24 10:01 1005Du命令功能说明:统计 ... -
环境变量
2011-08-22 16:58 813配置环境变量一般需要两个文件 举例: 第一个文件,文件名.p ... -
使用diff或者vimdiff比较远程文件(夹)与本地文件(夹)
2011-08-09 14:53 8053方法1:管道给diff $ssh eric@192.168 ... -
shell里面的特殊字符
2011-08-05 17:15 5113常见的有美元符号($),反斜线(\)和引号。 1。美元符号 ... -
shell 打开文件
2011-08-04 17:43 5769我们都知道shell语句可以执行主程序打开某一文件,比如c:盘 ... -
shell 读取文章行数
2011-08-04 17:42 1108总结了一下有六种方法: 现在有一个a文件,共有55行 ... -
shell uniq
2011-07-22 17:51 1620uniq 命令 文字 uniq是LINUX命令 ... -
shell if语句中的并列
2011-07-21 17:38 29543格式如下,在比较时,数字和字符串用不同的比较符号 1.如果a ... -
shell判断:数值、字符串、文件
2011-07-21 17:34 2310(1)数值测试: -eq 等于则为真。 -ne 不 ... -
shell 有关命令行参数
2011-07-21 17:32 2136通常调用UNIX程序的格式是: command options ...
相关推荐
本文将详细介绍 Shell 中各种括号的作用,包括小括号、双小括号、中括号、双中括号和大括号等。 一、小括号() 小括号的主要作用是用于命令组和命令替换。命令组的作用是将多个命令组合在一起,形成一个新的命令...
- **命令组**:单小括号内的命令会在一个新的子shell环境中按顺序执行。这意味着括号内的任何变量修改都不会影响到父shell或脚本的其他部分。括号中的命令可以通过分号进行分隔,最后一个命令后的分号可省略,且括号...
在Shell脚本编程中,括号有着特殊的意义和作用,主要分为五种类型:小括号()、双小括号(())、中括号([])、双中括号([[]])以及大括号({})。下面将详细介绍每一种括号的作用。 1. **小括号()** - 命令组:圆...
* ash:ash shell 是由 Kenneth Almquist 编写的, Linux 中占用系统资源最少的一个小 shell,它只包含 24 个内部命令。 * csh:csh 是 Linux 比较大的内核,它由以 William Joy 为代表的共计 47 位作者编成,共有 ...
- 区分大小写。 - 弱类型,即变量的类型由赋给它的值决定。 变量赋值有两种主要方式: 1. 直接赋值,如`a="hello"`。 2. 使用`read`命令从标准输入读取值,如`read a`。 变量引用格式为`$变量名`或`${变量名}`。...
### Shell经典教程知识点总结 #### 一、Shell简介与学习目的 **Shell**是一种用于与计算机操作系统进行交互的命令行接口。本教程主要介绍的是**Bash(Bourne Again Shell)**,它是Linux中最常用的Shell之一。在...
命令执行顺序章节则涉及了如何使用逻辑运算符&&和||以及括号()和花括号{}来将多个命令组合在一起,控制命令的执行顺序和条件。 第二部分专注于文本过滤技术,包括正则表达式介绍和grep命令家族。正则表达式章节中...
例如,在创建子shell时,任何在这个小括号内创建的变量都是局部变量,只存在于当前小括号的上下文中。双小括号"(( ))"用于算术运算,它允许进行算术运算和数值测试,并支持变量自增自减等操作。单中括号"[]"用于条件...
Shell编程是一种在Linux和Unix操作系统中广泛...这些实例涵盖了Shell编程的核心概念,通过它们你可以更好地理解和应用Shell脚本解决实际问题。学习和熟练掌握这些知识点将极大地提升你在Linux或Unix系统中的工作效率。
- **`[abc]`**:匹配括号内的任何一个字符,如`a`、`b`或`c`。 - **`[a-n]`**:匹配字符范围内的任何一个字符,如`a`到`n`之间的任何一个字符。 #### 五、判断文件的属性 在Shell中,可以使用`test`命令或`[`来...
在定义环境变量时,需要注意三个重要问题:第一,在等号 (=) 的两边不能有空格,否则将导致错误。第二个要注意的事是,当定义的环境变量值多于一个字时,引号是必须的。第三,虽然通常可以用双引号来替代单引号,但...
在IT领域,尤其是在Linux系统管理和自动化脚本编写中,Shell正则表达式(Regular Expression,简称regex)扮演着至关重要的角色。它是一种模式匹配工具,能够有效地搜索、查找、替换和解析文本。在这个名为"shell...
6. 小括号(())与大括号({})的差别:小括号用来创建子Shell来执行命令,而大括号用来将一系列命令作为单一命令组执行。 7. $(())、$()与${}的差别:$(())用于算术运算,$()用于命令替换,而${}用于变量扩展和...
17. 子shell:用括号`()`创建一个子shell,如`(command)`。 18. `read`命令:用于从标准输入读取字符或数据,`-n`指定读取字符数,`-s`不显示输入,`-p`设置提示信息,`-t`设定等待输入的超时时间,`-d`指定结束...
一直很喜欢写unix shell script, 因为写那么一点点东西可以有那么多效果,投入小,产出大,爽啊. 在写IBM AIX K Shell script时,感觉不那么友好,主要是有一些格式细节要求比较严格,不太习惯,后来写惯了也就好了,下面的...
5. 函数:Shell脚本中可以定义函数,以将脚本划分为更小、更可管理的部分。函数通常以"function"关键字或直接使用函数名和一对圆括号定义。 6. 脚本的调试和优化:有效的脚本调试方法包括在命令行中逐步执行脚本、...
在Shell中,你可以通过`function`关键字或直接定义一个函数名后跟花括号来创建函数。例如: ```bash myFunction() { echo "Hello, World!" } myFunction ``` 这将定义并调用一个名为`myFunction`的函数,...