Solaris: Ein einfaches Skript funktioniert nicht, ein einzelner Befehl funktioniert nicht

558
CSG

In meinen Solaris Illumos führe ich ein einfaches Skript aus:

 update_drv -a -i '[myhardware]' [driver] svcadm disable stmf svccfg import /mypath/myconfig svcadm enable stmf 

Es funktioniert nicht und gibt mir keinen Fehler. Der Service stmf geht in den Wartungsmodus und ich muss neu starten!

Ich habe herausgefunden, dass es funktioniert, wenn ich die einzelnen Befehle von der Konsole aus ausführe, aber wenn ich es in ein Skript stecke, funktioniert es nur in der ersten Zeile.

Kannst du dieses Verhalten erklären?

0

1 Antwort auf die Frage

1
Dennis Williamson

Wenn die erste Zeile genau so ist, wie Sie sie hier gezeigt haben, und Sie die Zeile von der Konsole aus in einem anderen Verzeichnis ausführen, als Sie das Skript ausführen, ist die wahrscheinlichste Erklärung, dass sich eine Datei im Skriptverzeichnis befindet Das hat einen ein Zeichen langen Dateinamen, der eines der Zeichen in "Treiber" ist.

Die Shell sieht [driver]einen potenziellen Glob und versucht, sie mit den Dateinamen im Verzeichnis abzugleichen. Wenn es einen passenden findet, ersetzt es den Glob durch den Namen. Der ausgeführte Befehl könnte beispielsweise so aussehen:

update_drv -a -i '[myhardware]' d 

was unbeabsichtigte Auswirkungen haben kann.

Um dies zu verhindern, setzen Sie das letzte Argument in Anführungszeichen, wie Sie es in dem vorhergehenden Argument getan haben.

Ich vermute jedoch, dass Ihre eingeklammerten Zeichenketten lediglich Platzhalter sind, und Sie haben Informationen ausgelassen, die hilfreich sein könnten, um mögliche Lösungen zu finden. Übrigensscheintdie Oracle-Dokumentation darauf hinzuweisen, dass ein Neustart wahrscheinlich ohnehin erforderlich ist.

Fügen Sie zur Problembehandlung Ihres Skripts set -xoben hinzu, damit Sie eine Ablaufverfolgung sehen können. Sie können auch eine Zeile wie echo "here"nach der ersten Zeile (oder einer beliebigen anderen Zeile) hinzufügen, um zu sehen, ob Ihr Skript es so weit bringt. Es ist wirklich merkwürdig, dass Sie keine Fehlermeldungen erhalten.

Eine andere Möglichkeit ist eine beschädigte binäre oder fehlerhafte Hardware. Dies ist jedoch unwahrscheinlich, da sie in der Befehlszeile ausgeführt wird.

Ein weiterer, möglicherweise primärer Aspekt ist, dass sich die Umgebung zwischen Ihrer Konsolensitzung und dem Skript unterscheidet. Sie sagen nicht, ob Sie Ihr Skript von der Kommandozeile oder von ausführen cron. Unter diesen Umständen PATHist es oft der Fall, dass die Umgebungsvariable unterschiedlich ist oder nicht festgelegt ist. Eine Möglichkeit, dies zu diagnostizieren, besteht darin, einen Befehl wie set > script_env.outin Ihrem Skript hinzuzufügen und set > cons_env.outin der Befehlszeile und diffden beiden Dateien auszuführen, um nach signifikanten Unterschieden zu suchen. Führen Sie das Skript und den Konsolenbefehl als verschiedene Benutzer aus? Das wirkt sich auch aus.