Re: [問題] 有點奇怪的bash script 參數問題

看板Linux作者 (幼斤)時間10年前 (2015/10/11 21:06), 10年前編輯推噓1(1019)
留言20則, 5人參與, 最新討論串2/2 (看更多)
承上, 感謝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://www.ptt.cc/bbs/Linux/M.1444568791.A.FCF.html

10/11 21:19, , 1F
因為find也把 '*' 當作 wildcard
10/11 21:19, 1F

10/11 21:22, , 2F
find . -name c\* 也有escape呀! 比較 ls c\*
10/11 21:22, 2F

10/11 21:58, , 3F
因為 find 最後吃到的還是 c*
10/11 21:58, 3F

10/11 21:59, , 4F
如果你資料夾底下有 ca cb cc 3個檔案
10/11 21:59, 4F

10/11 21:59, , 5F
為何 ls c\* 就不一樣?
10/11 21:59, 5F

10/11 21:59, , 6F
因為它是 find
10/11 21:59, 6F

10/11 22:00, , 7F
前面說有那3個檔案時 你執行 ls c* 會被變成 ls ca cb cc
10/11 22:00, 7F

10/11 22:01, , 8F
執行 ls c\* 實際執行的是 ls c*
10/11 22:01, 8F

10/11 22:02, , 9F
然後 find 本身會拿 -name 後面拿到的字串做 wildcard 比對
10/11 22:02, 9F

10/11 22:06, , 10F
普遍來說,ls c\* 是特例,還是 find c\*是特例?
10/11 22:06, 10F

10/11 22:07, , 11F
個人觀點是 find c\*
10/11 22:07, 11F

10/11 22:07, , 12F
因為不是每隻程式都會把吃進來的*再轉譯一次
10/11 22:07, 12F

10/11 22:10, , 13F
啊 但是 find 只有 -name 後面的參數才會喔
10/11 22:10, 13F

10/11 22:16, , 14F
真是的,被這些'棉棉角角'弄的頭婚腦帳
10/11 22:16, 14F

10/11 22:19, , 15F
如果你不希望 shell 亂解特殊符號的話 記得用 '' 框起來
10/11 22:19, 15F

10/11 23:10, , 16F
都不是特例啊 你寫個程式自己處理argv就知道了
10/11 23:10, 16F

10/11 23:28, , 17F
哪有什麼特例? man find 看一下 -name 會花很多時間?
10/11 23:28, 17F

10/11 23:28, , 18F
不然就 'c\*' 做兩次不會喔
10/11 23:28, 18F

10/11 23:31, , 19F
覺得 bash 預設很難用也可以 GLOBIGNORE 幹掉 *
10/11 23:31, 19F

10/12 01:14, , 20F
用set -x打開 就可以知道真正下到程式裡的argument們了
10/12 01:14, 20F
※ 編輯: zi98btcc (180.218.227.173), 10/30/2015 07:30:29
文章代碼(AID): #1M6bxN_F (Linux)
文章代碼(AID): #1M6bxN_F (Linux)