我正在编写一个 bash 脚本,根据我的耳机是否通过蓝牙连接来启用和禁用 MacBook 上的休眠功能,这样我就可以合上盖子,不受干扰地听音乐。它由 LaunchDaemon 任务每 5 秒触发一次。它使用
blueutil
命令 here,我让它在我的 Users/username/Library/Scripts folder
中运行此脚本:
#!/usr/bin/env
export PATH=$(cat /Users/klumpy/Library/Scripts/PATH)
export BLUEUTIL_ALLOW_ROOT=1
# Check if "WF-1000XM3 is connected, if yes disable sleep, if not, don't go to sleep.
echo $(blueutil --connected)
echo $(blueutil --connected | grep "WF-1000XM3")
if [[ $(blueutil --connected | grep "WF-1000XM3" -c) -ne 0 ]]; then
sudo pmset disablesleep 1
echo "Sleep Disabled"
else
sudo pmset disablesleep 0
echo "Sleep Enabled"
fi
我的 plist 文件在这里:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.bluetoothsleep</string>
<key>ProgramArguments</key>
<array>
<string>sudo</string>
<string>bash</string>
<string>/Users/klumpy/Library/Scripts/disablesleep</string>
</array>
<key>StandardErrorPath</key>
<string>/Users/klumpy/Documents/Programming/bin/stderr.txt</string>
<key>StandardOutPath</key>
<string>/Users/klumpy/Documents/Programming/bin/stdout.txt</string>
<key>StartInterval</key>
<integer>5</integer>
</dict>
</plist>
问题是,它找不到已安装的命令。
blueutil
是通过brew
安装的,我可以在终端窗口中运行它,或者如果我从终端运行disablesleep
文件并且它运行良好。起初,它找不到命令,所以我让它将 $PATH 打印到我的 stout.txt 文件中,我得到了这个:
/usr/bin:/bin:/usr/sbin:/sbin
这显然还不是全部。因此,我打开了一个新终端,并将 $PATH 复制到与我的脚本位于同一目录中的 PATH 文件,并且让程序导出第 3 行中的路径。我已经确认 $PATH 现在包含脚本的路径以及所有在普通终端窗口中运行
echo $PATH
时获得的其他目录。现在我从上面的程序中得到了这个输出:
Sleep Enabled
所以前两行 echo 没有做任何事情。
正常情况下,连接耳机时
blueutil --connected
会输出以下内容,未连接耳机时不会输出任何内容:
address: 94-db-56-96-b6-e0, connected (master, 0 dBm), not favourite, paired, name: "WF-1000XM3", recent access date: 2024-11-08 19:28:33 +0000
那么我做错了什么?我该如何解决这个问题?难道是我的 bash 语法错误,它实际上并没有运行
blueutil
?
echo $(blueutil --connected)
返回为空,则使用res=$(blueutil --connected); echo $res
或使用完整路径(例如/usr/bin/blueutil)。