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

看板Linux作者 (幼斤)時間10年前 (2015/10/11 02:13), 10年前編輯推噓0(0016)
留言16則, 3人參與, 最新討論串1/2 (看更多)
寫一個很簡單的script命名為gg,如下: #! echo $1 $1 代表第1個參數, 存好檔,改執行權限後,打指令: gg cok 那應該會得到什麼?答案為 cok gg cp* 那應該會得到什麼?答案為 cp* gg co* 那應該會得到什麼?答案為 co* -----不是 co* 耶! 這樣很怪嗎?是我系統問題?大家會這樣嗎? 那 gg co* 答案是什麼? 答案是 command 因為執行目錄下剛好有個名叫 command 檔, 如果把哪個 command 檔刪除,答案就變正常 co* 我覺得很怪,有人可解釋? http://i65ynb.2fh.co/pics/strlin25.jpg
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.58.98.94 ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1444500789.A.E7B.html ※ 編輯: zi98btcc (61.58.98.94), 10/11/2015 02:47:57

10/11 03:08, , 1F
因為你的 shell 會試著去展開那個星號
10/11 03:08, 1F

10/11 03:10, , 2F
展開方式就是 wildcard 的語法去比對現在目錄下的檔案
10/11 03:10, 2F

10/11 03:12, , 3F
可是參數跟檔案是兩回事呀!
10/11 03:12, 3F

10/11 03:15, , 4F
因為你的指令是在 shell 底下執行的
10/11 03:15, 4F

10/11 03:16, , 5F
所以他就主動的幫你轉換了 ' -')
10/11 03:16, 5F

10/11 03:16, , 6F
bash 在處理指令上就是這樣
10/11 03:16, 6F

10/11 03:44, , 7F
那下面例子用 telnet co\* 卻是有例外?
10/11 03:44, 7F

10/11 03:44, , 8F

10/11 03:46, , 9F
因為你用 '\' 把星號 escape 掉了
10/11 03:46, 9F

10/11 03:47, , 10F
bash 會把 '\' 後接的特殊符號原封不動傳給指令
10/11 03:47, 10F

10/11 03:49, , 11F
但是 gg co\* 卻顯示 command 喔
10/11 03:49, 11F

10/11 04:54, , 12F
因為你的 script 也是用 bash 執行的
10/11 04:54, 12F

10/11 04:55, , 13F
所以 \* 被以 * 的型式送進 gg 之後
10/11 04:55, 13F

10/11 04:55, , 14F
又因為 gg 本身是個 bash script 所以又被轉譯了一次
10/11 04:55, 14F

10/11 11:42, , 15F
對多數shell來說 只要遇到*幾乎就是檔名的wildcard
10/11 11:42, 15F

10/11 11:43, , 16F
會先展開再送給程式
10/11 11:43, 16F
※ 編輯: zi98btcc (180.218.227.173), 10/30/2015 07:32:48
文章代碼(AID): #1M6LKrvx (Linux)
文章代碼(AID): #1M6LKrvx (Linux)