為什么大多數編程語言(Python、Bash 等)不尊重程式上的可執行標志?
例如,如果我有一個沒有啟用可執行標志的 Python 腳本,則在 shell 中運行該程式會直接產生錯誤,但使用 Python 運行它不會:
$ ./test.py
bash: ./test.py: Permission denied
$ python3 test.py
... program output ...
為什么 xflag經常被忽略?
缺少x標志是否不表示不應運行/執行/解釋檔案?
uj5u.com熱心網友回復:
Python 只是解釋檔案,而不是執行它。
這里唯一被執行的是python它自己。
編輯
要理解的重要一點是,在 bash 的情況下,它實際上會執行您給它的程式,方法是尋找一個 shebang 行或簡單地為該程式分叉一個新行程并等待分叉的子行程完成。這就是如果executable未設定該位會引發錯誤的原因。
在 python 的情況下,python 不執行任何操作,它自動假定檔案是 python 腳本,然后解釋它。因此,python 并不關心您的腳本是否可執行,它唯一關心的是檔案是否實際上是一個檔案并且是可讀的。
uj5u.com熱心網友回復:
讓我們看看$ python3 test.py,我相信python3是可執行的,test.py是一個引數傳遞給python3并python3找到test.py同一檔案夾下的檔案,test.py有 r權限讓python3讀取內容。
uj5u.com熱心網友回復:
為什么大多數編程語言(Python、Bash 等)不尊重程式上的可執行標志?
[...]
缺少 x 標志是否表示不應運行/執行/解釋檔案?
正確:可執行權限沒有您試圖賦予它的廣泛含義。就系統而言,給定用戶對給定檔案的執行權限僅意味著系統將允許該用戶嘗試將該檔案作為命令執行。它與將檔案作為資料讀取的程式(例如 shell 和語言解釋器)的行為無關。
可以肯定的是,shell 等可以自己實作并行限制,但這并沒有多大意義。如果用戶可以讀取該檔案,那么他們可以制作自己的副本并分配他們想要的任何權限,以使他們能夠運行該副本。相反,shell 等傾向于采用更用戶友好的方法:它們嘗試做被要求做的事情,只要他們能做。
uj5u.com熱心網友回復:
這里似乎對 Linux 上的東西是如何執行的有一點誤解。
在 shell 中鍵入的任何內容都將在ENTER.
如果它是一個精靈可執行檔案,它將直接運行。
如果它有一個shebang行,內核將(嘗試)使用后面的任何內容!#作為解釋器來執行檔案的其余部分。
如果它不是可執行檔案并且沒有 shebang 行,則盡管有可執行標志,但您會看到您看到的錯誤。
您的問題的規范解決方案是在您的腳本中預先添加您的 python 代碼,例如:
#!/usr/bin/env python3
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/494298.html
