免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ailms
打印 上一主题 下一主题

问 :关于 [a-z] 的问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2006-12-15 12:03 |只看该作者
  1. LC_COLLATE=C ls [a-z]
复制代码

您这个问题涉及到shell命令执行原理。
以我的环境说话,经过一系列分割重组后,其实shell执行的是下面的语句
  1. LC_COLLATE=C ls a b c A B C
复制代码
shell解释好这句后才会执行整个语句,当然LC_COLLATE的赋值不起作用。

[ 本帖最后由 一梦如是 于 2006-12-15 12:09 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
22 [报告]
发表于 2006-12-15 12:03 |只看该作者
原帖由 Edengundam 于 2006-12-15 11:52 发表



帅哥为什么不加个分号??
LC_COLLATE=C; ls [a-z]

不能加,这种语法表示该变量的赋值只对当前的命令——即ls有效,不影响后续的命令。

[ 本帖最后由 woodie 于 2006-12-15 12:20 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
23 [报告]
发表于 2006-12-15 12:06 |只看该作者
原帖由 一梦如是 于 2006-12-15 12:03 发表
  1. LC_COLLATE=C ls [a-z]
复制代码

您这个问题涉及到shell命令执行原理。
以我的环境说话,经过一系列分割重组后,其实shell执行的是下面的语句
  1. LC_COLLATE=C ls a b c
复制代码
shell解释好这句后才会执 ...

谢谢!我才反应过来,globbing是在命令执行之前完成的,所以并不受行首的LC_COLLATE=C影响。脑瓜子短路了。;-P

论坛徽章:
0
24 [报告]
发表于 2006-12-15 12:07 |只看该作者
原帖由 一梦如是 于 2006-12-15 11:56 发表

这句说的对。
至于为什么bash会这么扩展,请看从man bash中摘抄的内容:

注意这里所说的sort
  1. ls -1
  2. a
  3. A
  4. b
  5. B
  6. c
  7. C
复制代码

看到这里,大家明白为什么默认情况下bash的[a-z]会扩展出大写字符了 ...



最终答案终于出现了。谢谢一梦如是

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
25 [报告]
发表于 2006-12-15 12:13 |只看该作者
原帖由 ailms 于 2006-12-15 12:07 发表



最终答案终于出现了。谢谢一梦如是

看看这里:
[gnu.bash.bug] BASH FAQ
看E9,说的比较详细些。

[ 本帖最后由 woodie 于 2006-12-15 12:15 编辑 ]

论坛徽章:
0
26 [报告]
发表于 2006-12-15 12:21 |只看该作者
呵呵,出个题目考考大家
  1. $ls
  2. a  A  b  B  c  C
  3. $ls *
  4. a  A  b  B  c  C
  5. $LC_COLLATE=C ls *
  6. A  B  C  a  b  c
复制代码

既然说扩展操作是在shell命令执行操作之前做的,那么为什么第三种情况,LC_COLLATE的赋值影响了输出结果呢?

论坛徽章:
0
27 [报告]
发表于 2006-12-15 12:31 |只看该作者
原帖由 一梦如是 于 2006-12-15 12:21 发表
呵呵,出个题目考考大家
  1. $ls
  2. a  A  b  B  c  C
  3. $ls *
  4. a  A  b  B  c  C
  5. $LC_COLLATE=C ls *
  6. A  B  C  a  b  c
复制代码

既然说扩展操作是在shell命令执行操作之前做的,那么为什么第三种情况,LC_CO ...


梦梦是不是:
LC_COLLATE=C 影响了 bash 执行的 ls....但是 ls 没有得到足够的参数...

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
28 [报告]
发表于 2006-12-15 12:31 |只看该作者
原帖由 一梦如是 于 2006-12-15 12:21 发表
呵呵,出个题目考考大家
  1. $ls
  2. a  A  b  B  c  C
  3. $ls *
  4. a  A  b  B  c  C
  5. $LC_COLLATE=C ls *
  6. A  B  C  a  b  c
复制代码

既然说扩展操作是在shell命令执行操作之前做的,那么为什么第三种情况,LC_CO ...

只是影响了输出结果的排序而已,ls排序时LC_COLLATE=C已经生效。

论坛徽章:
0
29 [报告]
发表于 2006-12-15 12:36 |只看该作者
原帖由 woodie 于 2006-12-15 12:13 发表

看看这里:
[gnu.bash.bug] BASH FAQ
看E9,说的比较详细些。


谢谢 woodie,先收藏了慢慢看

论坛徽章:
0
30 [报告]
发表于 2006-12-15 12:38 |只看该作者
原帖由 一梦如是 于 2006-12-15 12:21 发表
呵呵,出个题目考考大家
  1. $ls
  2. a  A  b  B  c  C
  3. $ls *
  4. a  A  b  B  c  C
  5. $LC_COLLATE=C ls *
  6. A  B  C  a  b  c
复制代码

既然说扩展操作是在shell命令执行操作之前做的,那么为什么第三种情况,LC_CO ...


这个的含义应该是在执行 ls 前先赋予 ls 一个“私有”的变量 LC_COLLATE,当执行完 ls 命令就消失了。

和 env LANG=C vi 一样吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP