it-swarm.com.de

Warum hängt mein Shell-Skript ohne die Erweiterung .sh?

Ich habe ein Shell-Skript /usr/local/bin/suspend Mit folgendem Inhalt erstellt:

#! /bin/sh

# Take an optional delay parameter
if [ "$#" -gt "0" ]; then
  sleep "$1"
fi

# Put the system to sleep
dbus-send --system --print-reply --dest="org.freedesktop.Hal" \
    /org/freedesktop/Hal/devices/computer \
    org.freedesktop.Hal.Device.SystemPowerManagement.Suspend \
    int32:0

Wenn ich chmod +x Und das Skript durch direkten Aufruf ausführe (z. B. einfach suspend oder /usr/local/bin/suspend In der Befehlszeile eingeben), passiert nichts und die Shell bleibt hängen. t sogar auf Strg-C antworten; Ich muss zu einer neuen Shell wechseln und den bash -Prozess beenden (der keine offensichtlichen Kinder hat).

Das Skript funktioniert einwandfrei, wenn ich es auf eine der folgenden Arten aufrufe:

  • Mit sh /usr/local/bin/suspend.
  • Mit . /usr/local/bin/suspend.
  • Benenne es in suspend.sh Um und rufe /usr/local/bin/suspend.sh Auf (oder nur suspend.sh, Da es im PATH steht).

Die letzte Option ist in Ordnung, aber ich frage mich immer noch: Was genau ist falsch daran, die Erweiterung .sh Nicht zu verwenden?

6
Chris Conway

suspend ist ein bash builtin,

suspend: suspend [-f]
Suspend Shell execution.

Suspend the execution of this Shell until it receives a SIGCONT signal.
Unless forced, login shells cannot be suspended.

Options:
  -f    force the suspend, even if the Shell is a login Shell

Exit Status:
Returns success unless job control is not enabled or an error occurs.

und da Builtins Vorrang haben, würde sich die Eingabe von suspend genau so verhalten, wie Sie es beschreiben: Die Shell blockiert, bis Sie sie töten (wenn Sie kill -CONT es wird fortgesetzt).

Dass Sie dasselbe Verhalten sehen, wenn Sie es mit dem Pfad aufrufen, ist entweder ein experimenteller Fehler oder ein Fehler in der Shell. Ich würde das erstere vor dem letzteren vermuten.

10
Chipaca

Wenn Sie möchten, dass Ihr Befehl ein eingebautes ersetzt, müssen Sie zuerst das eingebaute deaktivieren:

enable -n suspend

Sie können Ihren Befehl dann wie einen normalen Befehl ausführen. Dann aktivieren Sie das eingebaute wieder

enable suspend

Ich bin überrascht, dass das Builtin aufgerufen wird, wenn Sie Ihren Befehl mit dem vollständigen Pfad aufrufen.

1
glenn jackman

Um Ihre Frage zur sh-Erweiterung zu beantworten; Es ist eigentlich das Gegenteil, Sie sollten es nicht verwenden.

Verwenden Sie keine Erweiterungen für Ihre Skripte. Skripte definieren neue Befehle, die Sie ausführen können, und Befehle erhalten im Allgemeinen keine Erweiterungen. Außerdem: bash-Skripte sind nicht sh-Skripte (verwenden Sie also nicht .sh) und die Erweiterung verursacht nur dann Abhängigkeiten, wenn das Skript in einer anderen Sprache umgeschrieben wird.

Von # bash auf Freenode.net

0
Cas