我正在编写一个以 1 秒无限循环运行的 bash 脚本,如果它检测到计算机已插入交流电源,它将播放文件plugin.ogg
,ogg123
如果未插入,它将播放静音文件Silence.ogg
。但是,我遇到了一些问题。首先,它似乎不再循环(可能是我不得不加入的副作用,wait
以避免在第一次检测后出现循环充电器输入声音)。其次,它似乎不想更改目录/
,因此(我不确定是由于错误/
还是其他原因)找不到要播放的文件。请帮忙解决这个问题,谢谢!
#!/bin/bash
"cd /"
while true
do
if on_ac_power; then
"ogg123 plugin.ogg" ## Laptop on power
else
"ogg123 Silence.ogg" ## Laptop on battery
fi
sleep 10 ## wait 10 sec before repeating
done
如果在计算机拔下电源时运行,终端输出:
/home/brenden_mcfarling_live/Desktop/ac0.sh: line 3: cd /: No such file or directory
/home/brenden_mcfarling_live/Desktop/ac0.sh: line 10: ogg123 Silence.ogg: command not found
插入电源运行时的终端输出:
/home/brenden_mcfarling_live/Desktop/ac0.sh: line 3: cd /: No such file or directory
/home/brenden_mcfarling_live/Desktop/ac0.sh: line 8: ogg123 plugin.ogg: command not found
任何帮助,将不胜感激!
答案1
首先:为什么要将目录更改为 root / ? 您的文件位于那里吗?
从命令中删除引号“..”,这样它看起来像
ogg123插件.ogg
确保你已经安装了该包vorbis-tools
#sudo apt-get 安装 vorbis-tools
答案2
作为@JonnyTischbein 说:从命令中删除引号,因为否则 shell 将尝试执行文字命令"cd /"
,即它将搜索名为的可执行文件"cd /"
并执行它。当然,它不存在,你会得到bash: cd /: No such file or directory
。
也一样。它会尝试执行同样不存在的"ogg123 plugin.ogg"
文件。考虑到您的其他错误消息,我假设 *.ogg 文件位于(而不是)。因此,在更改为之后,将无法再找到文件,您需要提供完整路径。"ogg123 plugin.ogg"
/home/brenden_mcfarling_live/Desktop
/
/
放在一起:
#!/bin/bash
cd /
while true
do
if on_ac_power; then
## Laptop on power
ogg123 /home/brenden_mcfarling_live/Desktop/plugin.ogg
else
## Laptop on battery
ogg123 /home/brenden_mcfarling_live/Desktop/Silence.ogg
fi
## wait 10 sec before repeating
sleep 10
done
如果声音文件的路径或文件名包含空格,则可以使用引号但仅限于文件名:
ogg123 "/home/brenden_mcfarling_live/Desk Top/Very silent sound.ogg"
你可能还想看看这个问题(及其答案)Unix 和 Linux那里有关于如何立即捕捉插入/拔出交流适配器的事件,这样你就不需要轮询每 10 秒就会触发一次。
我承认,乍一看这有点复杂,但其思路是:
- 做一个有根据的猜测插入和拔出电源线时会发生什么情况
- 编写一个用于“插入”的脚本(播放第一个声音文件)
- 编写一个被调用“拔出”的脚本(播放第二个声音文件)
- 在下面的新文件中创建两条规则,
/etc/udev/rules.d
内容如下“插入后,运行 script1.sh”和“拔下电源后,运行 script2.sh”