![](/img/trans.png)
[英]What are all options to execute and source a bash file? Why shebang is not checked?
[英]What is the preferred Bash shebang ("#!")?
對於大多數用途,是否有任何Bash
shebang 客觀上比其他更好?
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
我依稀記得很久以前聽說在末尾添加破折號可以防止有人向您的腳本傳遞命令,但找不到任何詳細信息。
我建議使用:
#!/bin/bash
它不是 100% 可移植的(某些系統將bash
放置在/bin
以外的位置),但是許多現有腳本使用#!/bin/bash
的事實迫使各種操作系統使/bin/bash
至少成為指向主要位置。
替代方案:
#!/usr/bin/env bash
已被建議 - 但不能保證env
命令在/usr/bin
(我已經使用了它不在的系統)。 此外,此表單將使用當前用戶$PATH
的第一個bash
實例,這可能不是 bash shell 的合適版本。
(但是/usr/bin/env
應該可以在任何合理的現代系統上運行,要么是因為env
在/usr/bin
,要么是因為系統做了一些事情來使它工作。我上面提到的系統是 SunOS 4,我可能沒有大約 25 年未使用。)
如果您需要一個腳本在沒有/bin/bash
的系統上運行,您可以修改腳本以指向正確的位置(這無疑是不方便的)。
一個有點模糊的更新:我使用的一個系統, Termux ,一個在 Android 下運行的類似桌面 Linux 的層,沒有/bin/bash
( bash
是/data/data/com.termux/files/usr/bin/bash
) - 但它有特殊的處理來支持#!/bin/bash
。
/bin/sh
通常是指向系統默認 shell 的鏈接,它通常是bash
但在例如 Debian 系統上是較輕的dash
。 無論哪種方式,原始的 Bourne shell 都是sh
,所以如果您的腳本使用了一些bash
(第二代,“Bourne Again sh”)特定功能( [[ ]]
測試、數組、各種含糖的東西等),那么您應該更具體,稍后使用。 這樣,在未安裝 bash 的系統上,您的腳本將不會運行。 我知道可能會有一部關於這種演變的令人興奮的電影三部曲……但這可能是道聽途說。
另請注意,當作為sh
, bash
在某種程度上表現為 POSIX 標准sh
(另請參閱關於此的 GNU 文檔)。
使用 shebang 行調用適當的解釋器不僅適用於 BASH。 您可以將 shebang 用於系統上的任何解釋性語言,例如 Perl、Python、PHP (CLI) 和許多其他語言。 順便說一句,shebang
#!/bin/sh -
(它也可以是兩個破折號,即--
)結束 bash 選項之后的所有內容都將被視為文件名和參數。
使用env
命令使您的腳本可移植,並允許您為腳本設置自定義環境,因此可移植腳本應使用
#!/usr/bin/env bash
或者任何語言,例如 Perl
#!/usr/bin/env perl
請務必查看bash
的man
頁:
man bash
和env
:
man env
注意:在 Debian 和基於 Debian 的系統上,如 Ubuntu, sh
鏈接到dash
而不是bash
。 由於所有系統腳本都使用sh
。 根據 Debian 的說法,這允許 bash 增長並使系統保持穩定。
此外,為了保持調用 *nix 就像我從來沒有在 shebang 調用的腳本上使用文件擴展名一樣,因為您不能像在 Windows 上那樣省略可執行文件的調用擴展名。 file 命令可以將其識別為腳本。
這實際上取決於您如何編寫 bash 腳本。 如果您的/bin/sh
符號鏈接到 bash,當 bash 作為sh
調用時, 某些功能將不可用。
如果您想要特定於 bash 的非 POSIX 功能,請使用#!/bin/bash
給#./usr/bin/env 方法再投一票,我經常使用虛擬環境。 在我的情況下,我使用安裝在 virtualenv 中的 python。 使用 #./usr/bin/python 可能不是我想要的 python。 我使用 #!/usr/bin/env python 得到了正確的 python。
#!/bin/sh
因為大多數腳本不需要特定的 bash 功能,應該為 sh 編寫。
此外,這使得腳本可以在默認情況下沒有 bash 的 BSD 上運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.