![Shell-Skripte müssen aktualisiert werden, damit sie in verschiedenen *nix-Varianten ausgeführt werden können](https://rvso.com/image/97262/Shell-Skripte%20m%C3%BCssen%20aktualisiert%20werden%2C%20damit%20sie%20in%20verschiedenen%20*nix-Varianten%20ausgef%C3%BChrt%20werden%20k%C3%B6nnen.png)
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 grep
die Option -q (ruhig) nicht verwendet werden kann, Linux-Grep dies jedoch kann und in dieser Umgebung /usr/xpg4/bin/grep
nicht 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 POSIX
konforme Befehle (d. h. verwenden Sie awk
, nicht nawk
oder gawk
, grep
, nicht ), Optionen und Syntax zu halten und Folgendes /usr/xpg4/bin/grep
festzulegen :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/sh
jedoch die Verwendung des Shebang, der trotz der landläufigen Meinungnicht POSIX
kompatibel. Verwenden Sie einfach überhaupt kein Shebang. Sie können es verwenden, command -v sh
um zu sehen, welche POSIX
Shell 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 POSIX
Syntax 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.