看板 Linux 關於我們 聯絡資訊
寫一個很簡單的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
CP64: 因為你的 shell 會試著去展開那個星號 10/11 03:08
CP64: 展開方式就是 wildcard 的語法去比對現在目錄下的檔案 10/11 03:10
zi98btcc: 可是參數跟檔案是兩回事呀! 10/11 03:12
CP64: 因為你的指令是在 shell 底下執行的 10/11 03:15
CP64: 所以他就主動的幫你轉換了 ' -') 10/11 03:16
CP64: bash 在處理指令上就是這樣 10/11 03:16
zi98btcc: 那下面例子用 telnet co\* 卻是有例外? 10/11 03:44
zi98btcc: http://i65ynb.2fh.co/pics/strlin26.jpg 10/11 03:44
CP64: 因為你用 '\' 把星號 escape 掉了 10/11 03:46
CP64: bash 會把 '\' 後接的特殊符號原封不動傳給指令 10/11 03:47
zi98btcc: 但是 gg co\* 卻顯示 command 喔 10/11 03:49
CP64: 因為你的 script 也是用 bash 執行的 10/11 04:54
CP64: 所以 \* 被以 * 的型式送進 gg 之後 10/11 04:55
CP64: 又因為 gg 本身是個 bash script 所以又被轉譯了一次 10/11 04:55
danny8376: 對多數shell來說 只要遇到*幾乎就是檔名的wildcard 10/11 11:42
danny8376: 會先展開再送給程式 10/11 11:43
※ 編輯: zi98btcc (180.218.227.173), 10/30/2015 07:32:48