shell 字符匹配调戏

sh/bash/dash/ksh/zsh等Shell脚本
回复
xecle
帖子: 6
注册时间: 2012-10-18 20:04
系统: ubuntu

shell 字符匹配调戏

#1

帖子 xecle » 2012-11-27 15:43

ubuntu默认在shell中打开的字符匹配功能,及对?和*会自动对文件夹下的文件进行匹配
今天无意中被这个功能涮了一把。
$: echo $-
查看是否打开该功能,结果中有f表示关闭,没有f表示打开
打开:$: set +f
关闭:$: set -f

被涮的过程不提,下面开始调戏
进入任意一个目录
$: touch ls
$: ??

发生了什么,我的shell竟然执行了ls命令!
上面的touch可以换成任意会创建文件的命令,而且与文件中具体内容无关。
如果该目录下有中文目录,结果可能会是ls该中文目录的结果。

接下来,找几个目录,进去执行*试试看,诡异的结果啊

已测试受影响的shell: bash, dash
实在没想明白,这两个shell设计时怎么会想到匹配成文件夹中的文件名但是执行的却不是该文件
:em23
头像
tooktang
帖子: 674
注册时间: 2010-07-15 18:30

Re: shell 字符匹配调戏

#3

帖子 tooktang » 2012-12-12 11:19

长见识了。。

Sent from my Xperia S using Tapatalk 2
我是OS控…
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: shell 字符匹配调戏

#4

帖子 aerofox » 2012-12-12 20:41

因为扩展和执行是两个独立的过程,文件名扩展在扩展时考虑的是文件,执行时未必把它当作文件。
如果扩展过程和执行过程合并到一起,那么 “echo *” 这样的命令就该显示 “*” 而不是一堆文件名了。
回复