我创建了一个/usr/local/bin/suspend
包含以下内容的 shell 脚本:
#! /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
在命令行上),什么都不会发生,并且 shell 挂起——它甚至不响应 Ctrl-C;我必须切换到一个新的 shell 并终止该bash
进程(它没有明显的孩子)。
如果我通过以下任何一种方式调用它,该脚本就可以正常工作:
- 使用
sh /usr/local/bin/suspend
. - 使用
. /usr/local/bin/suspend
. - 将其重命名为
suspend.sh
并调用/usr/local/bin/suspend.sh
(或只是suspend.sh
,因为它在 中PATH
)。
最后一个选项很好,但我仍然想知道:不使用.sh
扩展到底有什么问题?
suspend
是内置的 bash,并且由于内置程序优先,因此只需键入
suspend
就会完全按照您的描述进行:shell 会阻塞,直到您将其杀死(如果您杀死它kill -CONT
,它会恢复)。通过使用路径调用它会看到相同的行为,要么是实验性错误,要么是 shell 中的错误。在后者之前,我会怀疑前者。
如果您希望您的命令取代内置命令,您首先必须禁用内置命令:
然后,您可以像普通命令一样运行您的命令。然后,您重新启用内置
当您使用完整路径调用命令时,我很惊讶内置函数被调用。
回答您关于 sh 扩展的问题;它实际上是相反的,你不应该使用它。
来自Freenode.net 上的#bash