2013-10-17 42 views
2

我通常在bash中寫我的腳本。我告訴其他人在bash中運行它們,我使用#!/usr/bin/env bash作爲shebang線。可移植shell腳本的用途是什麼?

當我閱讀關於shell腳本時,我經常發現有關不使用「bashisms」的「便攜式」解決方案的建議的評論。一個可移植的shell腳本似乎可以在任何Bourne Shell衍生程序中運行,例如。 bash,ksh或csh。

對我來說這似乎有點奇怪。爲什麼你不知道你在哪個shell中運行你的腳本?所以我的問題是:可移植shell腳本的實際用途是什麼?如果您想使用bash功能,爲什麼不簡單使用bash?

我認爲在需要可移植性時有一些常見的情況,爲什麼它會經常被提及?也許某些環境需要可移植性是出於歷史原因 - 我不知道 - 但我很想知道這些環境是什麼。

在此先感謝!

編輯:

我從你的回答和評論的結論(謝謝!):

  • 您可能需要避免新的bash特性,因爲它們可能無法在所有的bash版本,一些電腦將安裝舊版本。
  • 安裝程序腳本應該可以在不受控制的計算機上運行。並非所有類Unix操作系統默認都帶有bash。相反,POSIX shell幾乎可以普遍使用,因此它比bash提供更好的覆蓋範圍。
  • 您可能需要在1000臺計算機上運行腳本,但不希望(或不能)在任何地方安裝bash。一個POSIX外殼可能是可用的。
  • 您甚至可能無法在您喜歡的計算機上安裝bash。例如,這可能是由於缺乏管理權限,缺少平臺的bash軟件包,或缺乏「裸機」計算機等資源。再一次,POSIX shell可能是可用的。
  • 在某些環境中,您不能假定shell只是一個POSIX shell,例如在System V樣式的init腳本中。 (這是正確的嗎?)

底線:你不能總是使用bash您想要的位置,但POSIX外殼很可能已經存在。

+1

想象一下,您必須每晚在您管理的1000臺服務器上運行腳本。如果有些是舊的Solaris(例如),某些'bashisms'將會失敗。 – fedorqui

+0

'......對這個問題的回答往往幾乎完全基於觀點,而不是事實,參考或具體的專業知識。「# – devnull

+0

csh不是Bourne殼派生物。 –

回答

3

爲什麼你不知道你在哪個shell中運行腳本?

  • 您正在編寫一個必須在未知機器上運行的安裝程序腳本。
  • 您正在編寫一個腳本,可以使用多個已知的shell。
  • 並非所有bash功能的工作方式相同,即使在不同版本的bash(見compat31compat32compat40compat41選項)。

bash使用的一些常見的例子:

  • dash是系統外殼爲Debian和Ubuntu
  • Mac OS X的繼續bash 3.2代替4.x的
  • 出貨我認爲Solaris使用的版本需要在FreeBSD系統上單獨安裝。
1

這對於Bourne Shell的兼容性本身,使得腳本可以一個最基本的機器,簡單地僅具有sh任何具有任何(伯恩兼容)殼其他的機器上運行( S)。你顯然只有做到這一點完整和完整兼容性