Почему мой сценарий оболочки висит без расширения .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 в командной строке), ничего не происходит и оболочка висит & mdash; она даже не реагирует на 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 в 07:19

33 ответа

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

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

Из #bash на Freenode.net

0
ответ дан 10 August 2018 в 10:30

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

  enable -n suspend  

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

  enable suspend  

Я удивлен, что встроенный вызов вызывается, когда вы вызываете свою команду с полным путем. [ ! d4]

1
ответ дан 13 August 2018 в 16:55

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

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

Из #bash на Freenode.net

0
ответ дан 13 August 2018 в 16:55

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

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