作者zi98btcc (幼斤)
看板Linux
标题Re: [问题] 有点奇怪的bash script 参数问题
时间Sun Oct 11 21:06:28 2015
承上,
感谢CP64的解说,所以说万用字元*会在有参数的script执行中转译2次?
接下来就跟万用字元有关的问题,如下图:
ls c* 就是列出 c开头的档案,所以得到 cccc. command.sss
ls c\* 因为*被 \ escape掉了,所以列出叫 c* 的档案,但是没有叫 c* 的档案,
所以显示 c*: No such file or directory
find . -name c\* 应该也要显示 No such file or directory ?
为何可以找到./cccc.
./command.sss
http://i65ynb.2fh.co/pics/wildc.jpg
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.61.219.121
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Linux/M.1444568791.A.FCF.html
1F:→ bibo9901: 因为find也把 '*' 当作 wildcard 10/11 21:19
2F:→ zi98btcc: find . -name c\* 也有escape呀! 比较 ls c\* 10/11 21:22
3F:→ CP64: 因为 find 最後吃到的还是 c* 10/11 21:58
4F:→ CP64: 如果你资料夹底下有 ca cb cc 3个档案 10/11 21:59
5F:→ zi98btcc: 为何 ls c\* 就不一样? 10/11 21:59
6F:→ CP64: 因为它是 find 10/11 21:59
7F:→ CP64: 前面说有那3个档案时 你执行 ls c* 会被变成 ls ca cb cc 10/11 22:00
8F:→ CP64: 执行 ls c\* 实际执行的是 ls c* 10/11 22:01
9F:→ CP64: 然後 find 本身会拿 -name 後面拿到的字串做 wildcard 比对 10/11 22:02
10F:→ zi98btcc: 普遍来说,ls c\* 是特例,还是 find c\*是特例? 10/11 22:06
11F:→ CP64: 个人观点是 find c\* 10/11 22:07
12F:→ CP64: 因为不是每只程式都会把吃进来的*再转译一次 10/11 22:07
13F:→ CP64: 啊 但是 find 只有 -name 後面的参数才会喔 10/11 22:10
14F:→ zi98btcc: 真是的,被这些'棉棉角角'弄的头婚脑帐 10/11 22:16
15F:→ CP64: 如果你不希望 shell 乱解特殊符号的话 记得用 '' 框起来 10/11 22:19
16F:→ bibo9901: 都不是特例啊 你写个程式自己处理argv就知道了 10/11 23:10
17F:→ HamalAri: 哪有什麽特例? man find 看一下 -name 会花很多时间? 10/11 23:28
18F:→ HamalAri: 不然就 'c\*' 做两次不会喔 10/11 23:28
19F:→ HamalAri: 觉得 bash 预设很难用也可以 GLOBIGNORE 干掉 * 10/11 23:31
20F:推 ckc1ark: 用set -x打开 就可以知道真正下到程式里的argument们了 10/12 01:14
※ 编辑: zi98btcc (180.218.227.173), 10/30/2015 07:30:29