2015-10-07 643 views
1

因此,「chmod -R + x * .sh」在bash中不起作用。替代品可以找到here。我的問題是:爲什麼它不起作用? chmod是不是缺乏這個功能,因爲沒有人打算實現它,或者是否存在一些更深的bash/gnulib哲學?爲什麼chmod -R + x * .sh不工作?

+1

我想你想要的是'find。 -name'* .sh'-exec chmod + x {} +' – ymonad

+0

使用'find'而不是'-exec' –

+1

爲什麼你認爲它「不起作用」?它將名稱以'.sh'結尾的所有文件和名稱以'.sh'結尾的子目錄中的所有文件設置爲可執行位。工作得很好。 –

回答

3

這是因爲在bash中,通配符模式由shell擴展而不是由程序擴展。這與將模式傳遞給程序本身的Windows不同。讓我們考慮這個樣本directoy結構:

curdir 
|_ 1.sh 
|_ 2.sh 
|_ subdir 
    |_ 3.sh 
    |_ 4.sh 

說你從curdir目錄中運行命令chmod -R +x *.sh。 shell看到*.sh是通配符模式,並將其擴展爲1.sh 2.sh,因爲這些是與模式匹配的文件名。最後執行的命令變成chmod -R +x 1.sh 2.sh。正如你所看到的,沒有任何參數是一個目錄,所以-R開關不起作用。

有殼支持更復雜的模式。例如,如果你使用zsh,你可以運行下面的命令:

chmod +x **/*.sh # Note that -R is not required 

zshunderstands**模式指的是遞歸搜索子目錄。因此,在這種情況下最終的命令將是:

chmod +x 1.sh 2.sh subdir/3.sh subdir/4.sh 
3

*不處理chmod;這是一個被稱爲globbing的外殼特徵。 shell將*.sh擴展爲當前目錄中以.sh結尾的所有名稱的列表,並將它們作爲單獨的參數傳遞給chmod。 shell不知道該命令有任何遞歸目錄搜索方面,並且chmod永遠不知道命令行中有一個*

1

當您運行該命令時,它首先由您的shell進行預處理然後執行。在預處理階段,星號*被擴展爲匹配項(在本例中爲當前目錄下的shell文件)。然後,-R被忽略,因爲沒有可以遞歸的輸入目錄。

chmod並不缺乏此功能。它甚至不會獲得您的命令中最初帶有星號的信息。