2017-06-12 52 views
2

這個例子已經運行在2017年6月初的Raspbian Jessie 2017-04-10版的Raspberry Pi 3上.Bash的版本是4.3.30(1)。爲什麼bash數組的一部分作爲命令執行?

在最近嘗試使用一些代碼時,我發現正在執行bash數組的內容。幸運的是,它們並不危險!

這裏有一個簡單的函數:

#!/bin/bash 
echo "y.sh starting" 
echo "parameter string is <[email protected]>" 
args=([email protected]) 
echo "args array is <${args[@]}>" 
echo "args array length is ${#args[@]}" 
echo "y.sh ending" 

,這裏是輸出

[email protected]:~ $ ./y.sh 
y.sh starting 
parameter string is <> 
args array is <> 
args array length is 0 
y.sh ending 
[email protected]:~ $ ./y.sh ls 
y.sh starting 
parameter string is <ls> 
args array is <ls> 
args array length is 1 
y.sh ending 

無意外上方這裏。

添加Y *參數之後,ls命令輸出出現在陣列中:

[email protected]:~ $ ./y.sh ls y* 
y.sh starting 
parameter string is <ls y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq> 
args array is <ls y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq> 
args array length is 8 
y.sh ending 

但被添加時-La,沒有的額外信息

[email protected]:~ $ ./y.sh ls -la y* 
y.sh starting 
parameter string is <ls -la y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq> 
args array is <ls -la y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq> 
args array length is 9 
y.sh ending 

符號如果有人能夠解釋爲什麼命令正在執行以及可以進行哪些更改以使其不會執行,這將非常有幫助。爲什麼ls的「長」輸出沒有產生,這也是一個解釋。

感謝柴郡貓的家鄉。

回答

6

您未執行ls -la y*您將參數傳遞給y.sh。首先是ls,然後-la那麼全局y*擴展到每個文件成爲它自己的參數。

所以你沒有執行命令,但glob正在被shell擴展。

這就是運行ls y*時發生的情況。您實際上並沒有將字符串y*傳遞到ls。相反,外殼擴展y*,並將每個水珠作爲參數傳遞給ls相匹配的文件,所以你真的運行

ls y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq 

,當你鍵入

ls y* 

你可以看到同樣的效果也使用其他命令。例如,echo將打印它給出的每個參數,因此您可以通過執行echo y*來模擬ls y*(儘管echo不會顯示任何以y開頭的目錄的內容)

+0

謝謝。我嘗試使用@ runlevel0在這裏設置的方法https://stackoverflow.com/questions/12711786/bash-convert-command-line-arguments-into-array,並意識到問題發生之前,功能開始工作參數列表。這指向我http://www.tldp.org/LDP/abs/html/globbingref.html,它擴展了你的解釋。情況經常如此,根本原因並不是人們所期望的! – user8150417

+0

由於問題出現在函數外部,所以它不能被函數內部的任何東西修復。 @TaxpayerZombies對這個問題的迴應https://ksearch.wordpress。com/2010/09/23/wildcard-expansion-bash-shell /指向正確的方向 - 設置簡要禁用通配符的別名。 'alias y ='set -o noglob; yy'; yy(){〜/ y.sh「$ @」; set + o noglob;}' – user8150417