Shell-Skripte müssen aktualisiert werden, damit sie in verschiedenen *nix-Varianten ausgeführt werden können

Shell-Skripte müssen aktualisiert werden, damit sie in verschiedenen *nix-Varianten ausgeführt werden können

Ich habe eine Reihe von KSH- und CSH-Skripten, die aktualisiert werden müssen, damit sie in verschiedenen *nix-Varianten (Red Hat Linux, HP UX, Solaris) ausgeführt werden können. Die Shells sind im Home jedes unserer Server gemountet und müssen in jeder Umgebung funktionieren.

Wir haben Probleme mit bestimmten Befehlen, die unter Linux nicht zu finden sind. Beispielsweise verwenden Skripte nawk, was unter Linux durch ersetzt werden sollte gawk.

Skripte verwenden auch /usr/xpg4/bin/grep, weil unter Solaris grepdie Option -q (ruhig) nicht verwendet werden kann, Linux-Grep dies jedoch kann und in dieser Umgebung /usr/xpg4/bin/grepnicht existiert.

Ich möchte nicht jedes Skript anfassen, daher suche ich nach einer umfassenderen Lösung.

Ich habe versucht, Aliase einzurichten, das funktioniert. Aber nur im interaktiven Modus. Es scheint, als wäre die Verwendung von Aliasen in Skripten nicht ratsam ...

Ich kann in den Systemverzeichnissen einen symbolischen Link hinzufügen, aber dann brauche ich Administratorrechte, um dieses „Mocking“-Setup zu verwalten, und unser Setup ist nicht mehr portierbar …

Ich bin es nicht gewohnt, Systeme zu verwalten, daher vermisse ich möglicherweise eine Standardlösung für derartige Anforderungen.

Was kann ich tun, um portable Skripte zu haben, ohne sie alle neu schreiben zu müssen?

Antwort1

Der richtige Ansatz besteht darin, sich an POSIXkonforme Befehle (d. h. verwenden Sie awk, nicht nawkoder gawk, grep, nicht ), Optionen und Syntax zu halten und Folgendes /usr/xpg4/bin/grepfestzulegen :PATH

PATH=$(getconf PATH):$PATH

oder unter Solaris, wenn Sie die alte Bourne-Shell verwenden:

PATH=`getconf PATH`:$PATH

und das war's, Ihre dort gestarteten Skripte sollten unverändert ausgeführt werden. Vermeiden Sie #!/bin/shjedoch die Verwendung des Shebang, der trotz der landläufigen Meinungnicht POSIXkompatibel. Verwenden Sie einfach überhaupt kein Shebang. Sie können es verwenden, command -v shum zu sehen, welche POSIXShell auf Ihrem Computer verfügbar ist.

Es sieht jedoch so aus, als ob Sie Ihre nicht portablen Skripte unverändert lassen möchten. Dann könnten Sie den zuvor vorgeschlagenen Ansatz für Befehle mit der POSIXSyntax beibehalten und ein Frontend für die nicht portablen Befehle hinzufügen, das auf anderen Betriebssystemen verarbeitet werden kann. Da Ihre Skripte Shells im Bourne- oder Csh-Stil verwenden, sind Aliase und Funktionen nicht portierbar. Verwenden Sie daher besser Ihre eigene Wrapper-Skriptbibliothek, die Sie vor Ihre setzen PATH. Beispiel:

sh / ksh / bash / ... :

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

csh:

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

Antwort2

In diesem Fall verwende ich Variablen

AWK=awk
GREP=grep

dann testen Sie das Betriebssystem

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

(für Redhat, Suse, HP-UX, AIX wiederholen)

und verwende die Variable danach

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

Auf diese Weise habe ich nur ein Skript, das aber auf allen Hosts verwendet werden kann.

verwandte Informationen