Я создал скрипт оболочки /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
?
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
] это, это возобновляет).
То, что вы видите такое же поведение, вызывая его с путем, является либо экспериментальной ошибкой, либо ошибкой в оболочке. Я подозреваю, что первое раньше, чем второе.
Если вы хотите, чтобы ваша команда заменила встроенную, вам сначала нужно отключить сборку:
enable -n suspend
Затем вы можете запустить свою команду как обычную команду. Затем вы снова активируете встроенную функцию
enable suspend
Я удивлен, что встроенная функция вызывается при вызове команды с полным путем.
Чтобы ответить на ваш вопрос о расширении sh; на самом деле все наоборот, вы не должны его использовать.
Не используйте расширения для своих скриптов. Скрипты определяют новые команды, которые вы можете запускать, а команды обычно не имеют расширений. Также: bash-скрипт - это , а не sh-скрипт (поэтому не используйте .sh), и расширение будет вызывать головные боли зависимостей только в том случае, если скрипт будет переписан на другом языке.
blockquote>Из #bash на Freenode.net