Linux Shell脚本:pacmd:未找到命令

Linux Shell脚本:pacmd:未找到命令,linux,bash,shell,Linux,Bash,Shell,我试图编写一个简单的shell脚本来检测clementine是否正在运行。如果是,它将关闭节能功能。我在终端中尝试了pacmd命令,它工作得很好,但在脚本中没有。在第一个错误“pacmd no command found”后,我输入了完整路径,然后它说“/noSleep.sh:第5行:[/usr/bin/pacmd:没有这样的文件或目录”。所以我不明白它为什么找不到它。有什么帮助吗 我不想在clementine不播放音乐时关闭节能功能,所以我不想使用ps x | grep clementine

我试图编写一个简单的shell脚本来检测clementine是否正在运行。如果是,它将关闭节能功能。我在终端中尝试了pacmd命令,它工作得很好,但在脚本中没有。在第一个错误“pacmd no command found”后,我输入了完整路径,然后它说“/noSleep.sh:第5行:[/usr/bin/pacmd:没有这样的文件或目录”。所以我不明白它为什么找不到它。有什么帮助吗

我不想在clementine不播放音乐时关闭节能功能,所以我不想使用ps x | grep clementine

#!/bin/bash

while true
do
        if [/usr/bin/pacmd list-sink-inputs | grep Clementine]
    then
            xset -dpms; xset s off
    else
            xset +dpms; xset s on
    fi

    sleep 2m
done
脚本已更新:

#!/bin/bash

while true
do
    if [ `echo pacmd list-sink-inputs | grep "Clementine" | wc -l` ]
    then
            xset -dpms; xset s off
            echo off
    else
            xset +dpms; xset s on
            echo on
    fi

    sleep 30s
done

由于某些原因,它每次都返回true。我在测试pacmd语句时测试了Clementine not playing和playing。字符串Clementine在播放时显示,在不播放时不显示,因此我不确定它为什么不起作用。

除了语法错误(如前所述,
[
周围需要空格),将
/usr/bin/pacmd list sink输入的结果管道化到
grep-Clementine
会导致
grep
子shell中执行。这会使正在测试的返回复杂化。子shell中的命令成功完成,即使结果可能
未找到
。这就是
的位置e字符串
,它阻止在子shell中运行
grep
,可以保留您想要的返回:

#!/bin/bash

while true
do
    if [ grep -q Clementine <<<"$(/usr/bin/pacmd list-sink-inputs)" ]
    then
            xset -dpms; xset s off
    else
            xset +dpms; xset s on
    fi

    sleep 2m
done
!/bin/bash
虽然是真的
做

如果[grep-q Clementine始终在if语句中的
[
之后和
]
之前使用空格,正如cyrus在评论中提到的,那么您也不会在if语句中测试任何内容

grep-c“Clementine”
命令检查命令输出中出现的次数
“Clementine”
/usr/bin/pacmd list sink inputs
,因此如果大于
0
,则可能打开

while true
do
    if [ "$(/usr/bin/pacmd list-sink-inputs|grep -c "Clementine")" -gt  0  ]
    then
            xset -dpms; xset s off
    else
            xset +dpms; xset s on
    fi

    sleep 2m
done

您是否尝试过执行
ps | grep Clementine
?在
[
之后和
]
之前插入一个空格。首先看一看,它没有运行。但是我在语句中添加了倾斜引号,它成功了。但是,它返回了false(on)不管怎样。嗯,这很奇怪。
$()中的backticks和enclosure之间没有区别
。我处于劣势的一个问题是我没有
pacmd
。我假设它简单地将列表返回到
stdout
,但是,如果它将列表返回到
stderr
,您将需要重定向输出。
@DavidC.Rankin:是的。不知道
pacmd
的行为会让这有点棘手。问题不是这不是很有帮助。但是为什么在
if
中有方括号呢?你不是只想从
grep
返回代码吗?@DavidC.Rankin:另外,我倾向于使用进程替换而不是here字符串。例如
if grep-q Clementine