忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 941 | 回复: 13

[学习共享] 遇到一个 bash 的奇怪问题,大伙儿看看 [复制链接]

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
发表于 2017-03-18 14:33 |显示全部楼层

系统:CentOS 7 1611

  1. $ uname -a
  2. Linux localhost 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
复制代码

bash 版本:

  1. $ bash --version
  2. GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)
  3. Copyright (C) 2011 Free Software Foundation, Inc.
  4. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
复制代码

1 将 a 赋值 one,没问题:


  1. $ a=one; echo $a
  2. one
复制代码

2 将a赋值为two,然后打印,这个结果我能接受,因为 $a 提前被解释了,所以仍然是 one
  1. $ a=two echo $a
  2. one
复制代码

3 但我认为经过第2步,a的值已经变为 two,试试:

  1. $ a=three echo $a > $a
复制代码

但是我错了,生成了一个名叫 one 的文件,文件内容仍然是 one
  1. $ ls
  2. one
复制代码
  1. $ cat one
  2. one
复制代码
有没有什么好想法?


论坛徽章:
1
15-16赛季CBA联赛之同曦
日期:2017-03-19 09:57:50
发表于 2017-03-18 16:34 |显示全部楼层
表示没有重现- -

论坛徽章:
1
15-16赛季CBA联赛之同曦
日期:2017-03-19 09:57:50
发表于 2017-03-18 16:34 |显示全部楼层
表示没有重现- -

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
发表于 2017-03-18 17:41 |显示全部楼层

说说你的运行环境,和试验结果?

论坛徽章:
117
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59
发表于 2017-03-19 09:29 |显示全部楼层
回复 1# wait_rabbit

$ a=1; a=2 eval echo "in=$a"; echo "out=$a"
in=1
out=1

$ a=1; a=2 eval echo "in=\$a"; echo "out=$a"
in=2
out=1

$ set -x

$ a=1; a=2 eval echo "in=$a"; echo "out=$a"
+ a=1
+ a=2
+ eval echo in=1
++ echo in=1
in=1
+ echo out=1
out=1

$ a=1; a=2 eval echo "in=\$a"; echo "out=$a"
+ a=1
+ a=2
+ eval echo 'in=$a'
++ echo in=2
in=2
+ echo out=1
out=1


论坛徽章:
1
15-16赛季CBA联赛之同曦
日期:2017-03-19 09:57:50
发表于 2017-03-19 10:10 |显示全部楼层
回复 4# wait_rabbit

生成了two文件,内容为two, Cygwin上跑的

我之前理解是楼主没有加分号,shell 执行一条语句的时候,可能是从右往左执行的,但后面那个 a=three 生成一个 one文件和内容就解释不通了

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
发表于 2017-03-19 11:15 |显示全部楼层
jason680 发表于 2017-03-19 09:29
回复 1# wait_rabbit

$ a=1; a=2 eval echo "in=$a"; echo "out=$a"


你这个结果可以理解,都转义了,自然是在执行的时候才计算 $a 的值。

现在的问题是,我的试验没法解释。

你有试过吗?

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
发表于 2017-03-19 11:16 |显示全部楼层
农民伯伯丶 发表于 2017-03-19 10:10
回复 4# wait_rabbit

生成了two文件,内容为two, Cygwin上跑的


可能和不同的 shell 还有关?

生成 two 我倒是可以理解,生成 one 实在没法接受。

大伙儿都来试试啊。

论坛徽章:
117
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59
发表于 2017-03-19 11:53 |显示全部楼层
本帖最后由 jason680 于 2017-03-19 12:07 编辑

回复 7# wait_rabbit

Yes, I did.
but you CANNOT understand what they mean

$ bash --version
GNU bash, version 4.2.25(1)-release (i686-pc-linux-gnu)

OS: Ubuntu 12.04 LTS


your code

$ a=one; echo $a      # two command a=one and echo $a
one

$ a=two echo $a       # one command, a=two (in inside), echo $a (in outside)    Note: $a=one (in outside)
one

>> 3 但我认为经过第2步,a的值已经变为 two,
那是你认为, 事实(shell认为--解释)与你认为不同

$ a=three echo $a > $a    # one command, a=three (in inside), echo $a > $a ( in outside)    Note: $a=one (in outside)

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
发表于 2017-03-19 13:46 |显示全部楼层
jason680 发表于 2017-03-19 11:53
回复 7# wait_rabbit

Yes, I did.


我知道第一次是2条指令,第二、三次都是一条指令。

但是你把第二、三次的 a 都解释成  inside,后边 echo 的都是 outside,这好像没法说服人吧?

姑且我承认你的 inside 的解释:

  1. a=two echo $a
复制代码

那和这个不echo的命令在本质上有什么区别呢?

  1. a=two
复制代码

后边要不要 echo 就能决定前边是不是 inside?

除非我都加了一个括号,类似

(a=two echo $a)

(a=three echo $a > $a)

这样算是启动了一个新的子进程, a 才是正儿八经的 inside。可能我对 bash 的用法还有误解。




您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP