因此,「chmod -R + x * .sh」在bash中不起作用。替代品可以找到here。我的問題是:爲什麼它不起作用? chmod是不是缺乏這個功能,因爲沒有人打算實現它,或者是否存在一些更深的bash/gnulib哲學?爲什麼chmod -R + x * .sh不工作?
1
A
回答
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
zsh
understands的**
模式指的是遞歸搜索子目錄。因此,在這種情況下最終的命令將是:
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
並不缺乏此功能。它甚至不會獲得您的命令中最初帶有星號的信息。
相關問題
- 1. 爲什麼sh腳本不能工作
- 2. 爲什麼x = params.dup不工作,但x = @ model.dup工作?
- 3. 我如何獲得chmod -R爲我工作? (操作不允許)
- 4. 爲什麼chmod命令不會在這裏工作?
- 5. 爲什麼read.clipboard在R中不工作
- 6. 爲什麼不工作
- 7. 爲什麼file_exists()不工作?
- 8. 遞歸Chmod不工作PHP
- 9. 爲什麼removeEventListener不工作
- 10. 爲什麼socket.sendall()不工作?
- 11. 「$ {x %% *}」在sh中的含義是什麼?
- 12. [R爲什麼 「==」 操作未%
- 13. 爲什麼我的雙積分是R不工作
- 14. 爲什麼Array.push.apply不工作?
- 15. printf不工作爲什麼?
- 16. countDownTimer不工作,爲什麼?
- 17. 爲什麼不工作notifyItemChanged
- 18. 爲什麼nspredicate不工作
- 19. 爲什麼the_author()不工作
- 20. 爲什麼navigationItem.titleView不工作?
- 21. 爲什麼AlarmMAnager不工作?
- 22. 這爲什麼不工作?
- 23. 爲什麼Zend_Route不工作?
- 24. 爲什麼不工作
- 25. 爲什麼.data不工作?
- 26. 爲什麼不工作
- 27. 爲什麼不FetchType.Lazy工作?
- 28. 爲什麼jquery不工作
- 29. 爲什麼不工作
- 30. 爲什麼不translit工作?
我想你想要的是'find。 -name'* .sh'-exec chmod + x {} +' – ymonad
使用'find'而不是'-exec' –
爲什麼你認爲它「不起作用」?它將名稱以'.sh'結尾的所有文件和名稱以'.sh'結尾的子目錄中的所有文件設置爲可執行位。工作得很好。 –