需要更新 shell 腳本,以便它們可以在不同的 *nix 風格中執行

需要更新 shell 腳本,以便它們可以在不同的 *nix 風格中執行

我有一堆 ksh 和 csh 腳本需要更新才能在不同的 *nix 風格(red hat linux、hp ux、solaris)中運行。 shell 安裝在我們每台伺服器的本機,我們需要讓它們在每個環境中運作。

我們遇到了一些在 Linux 下找不到的特定命令的問題。例如腳本使用,在 linux 上nawk應替換為。gawk

腳本也使用,/usr/xpg4/bin/grep因為在Solaris上grep不能採用-q(安靜)選項,但Linux的grep可以,並且在這個環境中/usr/xpg4/bin/grep不存在。

我不想接觸每個腳本,所以我正在尋找更全局的解決方案。

我嘗試過設定別名,有效。但僅限於互動模式。看起來不建議在腳本中使用別名...

我可以在系統目錄中添加符號鏈接,但隨後我需要管理員權限來管理這個“模擬”設置,並且我們的設置不再可移植......

我不習慣系統管理,所以我可能會錯過滿足這種需求的標準解決方案。

我該怎麼做才能擁有可移植腳本而不需要重寫它們?

答案1

正確的方法是堅持使用POSIX相容的命令(即使用awk、 notnawkgawkgrep、 not )、選項和語法,並這樣/usr/xpg4/bin/grep設定:PATH

PATH=$(getconf PATH):$PATH

或在 Solaris 上(如果使用舊版 Bourne shell):

PATH=`getconf PATH`:$PATH

就是這樣,您在那裡啟動的腳本應該不加修改地運行。不過,請避免使用#!/bin/shshebang,儘管人們普遍認為這是不是 POSIX符合。根本不使用shebang。您可能會使用command -v sh,看看POSIX您的機器上有什麼 shell 可用。

但是,您似乎希望保持不可移植腳本不變。然後,您可以保留先前建議的使用語法的命令方法POSIX,並新增一個前端以便在其他作業系統上處理非可移植命令。由於您的腳本使用 Bourne 或 Csh 風格的 shell,因此別名和函數不可移植,因此最好使用您自己的包裝腳本庫,將其放在PATH.例如:

sh / ksh / bash / ...:

PATH=~/bin:`getconf PATH`:$PATH 

命令列:

set path = ( ~/bin `getconf PATH` $path)

-

mkdir -p ~/bin
cd ~/bin
cat > awk <<%
#!/bin/sh
PATH=`getconf PATH`:$PATH awk "$@"
%
ln -s awk nawk
ln -s awk gawk

答案2

在這種情況下我使用變量

AWK=awk
GREP=grep

然後測試作業系統

if [ $(uname -s) == "SunOS" ]
then
  AWK=/usr/bin/nawk
  GREP=/usr/xpg4/bin/grep
fi

(對於 redhat、suse、hp-ux、aix 重複此操作)

並在之後使用變數

if $GREP -q whatever /some/file
then
   $AWK -F: '{....}' /some/file
fi

這樣我只有一個腳本,但可以在所有主機中使用。

相關內容