簡體   English   中英

首選 Bash shebang(“#?”)是什么?

[英]What is the preferred Bash shebang ("#!")?

對於大多數用途,是否有任何Bash shebang 客觀上比其他更好?

  • #!/usr/bin/env bash
  • #!/bin/bash
  • #!/bin/sh
  • #!/bin/sh -
  • ETC

我依稀記得很久以前聽說在末尾添加破折號可以防止有人向您的腳本傳遞命令,但找不到任何詳細信息。

您應該使用#!/usr/bin/env bash以實現可移植性:不同的 *nixes 將bash放在不同的位置,使用/usr/bin/env是運行在PATH上找到的第一個bash的解決方法。 而且sh不是bash

我建議使用:

#!/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/bashbash/data/data/com.termux/files/usr/bin/bash ) - 但它有特殊的處理來支持#!/bin/bash

/bin/sh通常是指向系統默認 shell 的鏈接,它通常是bash但在例如 Debian 系統上是較輕的dash 無論哪種方式,原始的 Bourne shell 都是sh ,所以如果您的腳本使用了一些bash (第二代,“Bourne Again sh”)特定功能( [[ ]]測試、數組、各種含糖的東西等),那么您應該更具體,稍后使用。 這樣,在未安裝 bash 的系統上,您的腳本將不會運行。 我知道可能會有一部關於這種演變的令人興奮的電影三部曲……但這可能是道聽途說。

另請注意,當作為shbash在某種程度上表現為 POSIX 標准sh (另請參閱關於此的 GNU 文檔)。

使用 shebang 行調用適當的解釋器不僅適用於 BASH。 您可以將 shebang 用於系統上的任何解釋性語言,例如 Perl、Python、PHP (CLI) 和許多其他語言。 順便說一句,shebang

#!/bin/sh -

(它也可以是兩個破折號,即-- )結束 bash 選項之后的所有內容都將被視為文件名和參數。

使用env命令使您的腳本可移植,並允許您為腳本設置自定義環境,因此可移植腳本應使用

#!/usr/bin/env bash

或者任何語言,例如 Perl

#!/usr/bin/env perl

請務必查看bashman頁:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM