Почему мой сценарий оболочки зависает без расширения .sh?

Я создал скрипт оболочки /usr/local/bin/suspend со следующим содержанием:

#! /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

Если я chmod +x и запустил скрипт, вызвав его напрямую (например, просто набрав suspend или /usr/local/bin/suspend) в командной строке) ничего не происходит и оболочка зависает - она ​​даже не отвечает на Ctrl-C; Мне нужно переключиться на новую оболочку и убить процесс bash (у которого нет явных потомков).

Сценарий работает нормально, если я вызываю его любым из следующих способов:

  • Использование sh /usr/local/bin/suspend.
  • Использование . /usr/local/bin/suspend.
  • Переименование его в suspend.sh и вызов /usr/local/bin/suspend.sh (или просто suspend.sh, так как он в PATH).

Последний вариант в порядке, но все же мне интересно: что именно не так с использованием расширения .sh?

6
задан 13 December 2010 в 06:19

3 ответа

suspend - это встроенная утилита bash,

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.

, и поскольку встроенные функции имеют приоритет, простое нажатие suspend будет вести себя точно так, как вы описали: оболочка блокируется, пока вы ее не убьете (если вы kill -CONT ] это, это возобновляет).

То, что вы видите такое же поведение, вызывая его с путем, является либо экспериментальной ошибкой, либо ошибкой в ​​оболочке. Я подозреваю, что первое раньше, чем второе.

0
ответ дан 13 December 2010 в 06:19

Если вы хотите, чтобы ваша команда заменила встроенную, вам сначала нужно отключить сборку:

enable -n suspend

Затем вы можете запустить свою команду как обычную команду. Затем вы снова активируете встроенную функцию

enable suspend

Я удивлен, что встроенная функция вызывается при вызове команды с полным путем.

0
ответ дан 13 December 2010 в 06:19

Чтобы ответить на ваш вопрос о расширении sh; на самом деле все наоборот, вы не должны его использовать.

Не используйте расширения для своих скриптов. Скрипты определяют новые команды, которые вы можете запускать, а команды обычно не имеют расширений. Также: bash-скрипт - это , а не sh-скрипт (поэтому не используйте .sh), и расширение будет вызывать головные боли зависимостей только в том случае, если скрипт будет переписан на другом языке.

Из #bash на Freenode.net

0
ответ дан 13 December 2010 в 06:19

Другие вопросы по тегам:

Похожие вопросы: