作者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/m.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