有點奇怪的bash script 參數問題 - Linux

Table of Contents

寫一個很簡單的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
--

All Comments

Eden avatarEden2015-10-13
因為你的 shell 會試著去展開那個星號
Rae avatarRae2015-10-14
展開方式就是 wildcard 的語法去比對現在目錄下的檔案
Hardy avatarHardy2015-10-17
可是參數跟檔案是兩回事呀!
Joseph avatarJoseph2015-10-17
因為你的指令是在 shell 底下執行的
Yuri avatarYuri2015-10-17
所以他就主動的幫你轉換了 ' -')
bash 在處理指令上就是這樣
Agnes avatarAgnes2015-10-19
那下面例子用 telnet co\* 卻是有例外?
http://i65ynb.2fh.co/pics/strlin26.jpg
Connor avatarConnor2015-10-22
因為你用 '\' 把星號 escape 掉了
Brianna avatarBrianna2015-10-27
bash 會把 '\' 後接的特殊符號原封不動傳給指令
Agatha avatarAgatha2015-10-31
但是 gg co\* 卻顯示 command 喔
Megan avatarMegan2015-11-04
因為你的 script 也是用 bash 執行的
Frederica avatarFrederica2015-11-07
所以 \* 被以 * 的型式送進 gg 之後
又因為 gg 本身是個 bash script 所以又被轉譯了一次
Poppy avatarPoppy2015-11-08
對多數shell來說 只要遇到*幾乎就是檔名的wildcard
Leila avatarLeila2015-11-12
會先展開再送給程式