电源 AC 插件的 Bash 脚本

电源 AC 插件的 Bash 脚本

我正在编写一个以 1 秒无限循环运行的 bash 脚本,如果它检测到计算机已插入交流电源,它将播放文件plugin.oggogg123如果未插入,它将播放静音文件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”

相关内容