原帖由 lululau 于 2009-3-14 11:25 发表
A=B是传给子进程的一个环境,这个赋值对于当前进程是无效的
首先这个你用A=B command $A这种形式
在产生子进程之前,$A就被代换了,代换成了空值
再者,echo是shell的内建命令,不产生子进程
原帖由 thinshootout 于 2009-3-14 11:07 发表
在阅读《shell十三问》时,遇到如下问题:
#! /bin/sh
A=B echo $A
echo $A
请问输出是什么?为什么?谢谢~
原帖由 ywlscpl 于 2009-3-14 13:06 发表
我的理解
A=B echo $A ($A先被替换成空,因为变量A为空)
==>先执行A=B,再执行echo
echo $A,则是空
不明白的就是A=B为什么变成在子shell中执行了,所以echo $A为空
原帖由 ywlscpl 于 2009-3-14 12:52 发表
黑哥,有一点不理解,请指教
a=b echo是不是等价于(a=b;echo),a=b相当于在子shell中运行的,未影响到父shell的变量a
原帖由 wendaozhe 于 2009-3-14 15:41 发表
我一直的理解是:当在命令行运行./test(假设lz的脚本的名字),当前shell便产生一个subshell的子进程用以执行脚本,当subshell遇上"A=B echo $A"时,(由于都是内建命令,故不产生子进程)奉行先替换后重组的” ...
原帖由 thinshootout 于 2009-3-14 11:07 发表
在阅读《shell十三问》时,遇到如下问题:
#! /bin/sh
A=B echo $A
echo $A
请问输出是什么?为什么?谢谢~
奉行先替换后重组的”原则“,先把$A替换(也就是什么都没有!),然后执A=B echo ,执行完这句A=B ,然后subshell依次执行下面的语句,echo $A,此时$A就应当是B了
都说了"VAR=value comman"这样的形式是将VAR作为一个环境变量传给子进程
ABS上面说的
bash man里面说得很清楚。
bash先标记命令行中命令名前的变量赋值,然后对后面的参数进行展开。A=B echo $A中的变量赋值只影响当前命令的执行环境,不影响当前shell的环境。
黑哥解释也是一个意思
原帖由 wendaozhe 于 2009-3-14 17:06 发表
因为在subshell中并没有产生新的进程,如果要我强行理解的话,那就是:var=value command这种形式只把变量给子进程,自己都不用!
原帖由 blackold 于 2009-3-14 17:20 发表
命令comand是可以使用var=value的,而且这也是var=value的目的,我们常用的LC_ALL=C command,就是让command在一个LC_ALL=C的环境中执行,而不是使用当前locale.
原帖由 lululau 于 2009-3-14 11:25 发表
A=B是传给子进程的一个环境,这个赋值对于当前进程是无效的
首先这个你用A=B command $A这种形式
在产生子进程之前,$A就被代换了,代换成了空值
再者,echo是shell的内建命令,不产生子进程
原帖由 nhw_cs 于 2009-3-14 14:44 发表
a=b 与 echo 都是shell的内部功能, 也就是由shell本身实现的, 当然不产生所谓的子进程. 只有command 是外部应用程序时当前shell才产生子进程来执行command ( fork + exec )
原帖由 youshuang 于 2009-3-16 15:18 发表
关于子进程,是这么回事:
我们的shell(默认BASH)是所谓解释器,当你输入一个命令执行的时候,它通过fork命令创建一个子进程,然后用exec命令把你的命令替换掉这个子进程。这个时候就有两个进程,一个是shell, ...
原帖由 blackold 于 2009-3-14 14:29 发表
bash先标记命令行中命令名前的变量赋值,然后对后面的参数进行展开。A=B echo $A中的变量赋值只影响当前命令的执行环境,不影响当前shell的环境。
原帖由 wtuter 于 2009-3-16 18:54 发表
[root@]# export A=B echo $A
[root@]# A=B echo $A
B
[root@]# export A=B echo $A
[root@]# echo $A
B
$ echoa:
::
$ a=foo eval echo \$a
foo
$ echoa:
::
原帖由 labrador001 于 2009-3-16 20:10 发表
#! /bin/sh
a=b echo $a
echo $a
echo ${a=123}
我想上面的代码可以说明问题。 ${a=123} 可以参加shell13问中:${file=my.file.txt} :若 $file 沒設定,則使用 my.file.txt 作傳回值,同時將 $file 賦 ...
1,將 line 拆成 words (IFS很重要)
原帖由 blackold 于 2009-3-24 11:00 发表
sorry,刚才漏写了两个字。
将line拆成words( split into tokens)不是根据metacharacter吗?
原帖由 ywlscpl 于 2009-3-24 11:06 发表
现在的理解是
a=b echo $a
1、$a先被替换为空:a=b echo
2、空格作为IFS处理:a=b;echo
3、结果:输出一个空行
4、当前shell环境中$a的值为空,a=b并未影响到当前shell环境,这个是bash定义var=str command这 ...
The following is a brief description of the shell's operation when it
reads and executes a command. Basically, the shell does the following:
1. Reads its input from a file (*note Shell Scripts:, from a string
supplied as an argument to the `-c' invocation option (*note
Invoking Bash:, or from the user's terminal.
2. Breaks the input into words and operators, obeying the quoting
rules described in *Note Quoting::. These tokens are separated by
`metacharacters'. Alias expansion is performed by this step
(*note Aliases:.
`IFS'
A list of characters that separate fields; used when the shell
splits words as part of expansion.
原帖由 ywlscpl 于 2009-3-24 11:19 发表
谢谢前辈指教
自己说的很不严谨,第4点变量a是没赋值。
关于第2点,如何验证a=b这条语句是执行过的呢?
发现 a=b echo $a和ls echo $a不一样,前者输出一个空行(a=b是否执行过不太明确),后者其实执行的是 ...
原帖由 blackold 于 2009-3-24 11:28 发表
按照bash man, bash将:
a=b echo $a
split into 3 个 tokens:
a=b
echo
$a
您的meta与bash的metacharacter不同。
`metacharacter'
A character that, when unquoted, separates words. A metacharacter
is a `blank' or one of the following characters: `|', `&', `;',
`(', `)', `<', or `>'.
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |