如果bin/kafka-server-start.sh config/server.properties
正在运行
cmus-remote
获取一些信息
cmus
正在运行的cmus的输出是正确的,当cmus没有运行时我得到了
#!/bin/zsh
pgrep cmus>& /dev/null
if [ $? -eq 0 ]; then
title=$(cmus-remote -Q | grep tag | grep title | sed 's/tag title //')
artist=$(cmus-remote -Q | grep tag | grep " artist " | sed 's/tag artist //')
album=$(cmus-remote -Q | grep tag | grep " album " | sed 's/tag album //')
track=$(cmus-remote -Q | grep tag | grep tracknumber | sed 's/tag tracknumber //')
echo $track $title - $artist - $album
else
echo ""
fi
我有一个解决方法是在每个相应的行上添加cmus-remote: cmus is not running
cmus-remote: cmus is not running
cmus-remote: cmus is not running
cmus-remote: cmus is not running
-
,但这不是我想要的,我希望代码根本不被执行。而且我没有输出else案例的输出。
答案 0 :(得分:0)
pgrep cmus>& /dev/null
if [ $? -eq 0 ]; then
title=$(cmus-remote -Q | grep tag | grep title | sed 's/tag title //') > /dev/null 2>&1
artist=$(cmus-remote -Q | grep tag | grep " artist " | sed 's/tag artist //') > /dev/null 2>&1
album=$(cmus-remote -Q | grep tag | grep " album " | sed 's/tag album //') > /dev/null 2>&1
track=$(cmus-remote -Q | grep tag | grep tracknumber | sed 's/tag tracknumber //') >/ dev/null 2>&1
echo $track $title - $artist - $album
else
echo ""
fi
添加> /dev/null 2>&1
2指的是该过程的第二个文件描述符,即stderr
。
>
表示重定向。
&1
表示重定向的目标应与第一个文件描述符的位置相同,即stdout
。
因此,此命令首先将stdout重定向到/dev/null
,然后将stderr重定向到那里。这有效地使所有输出(常规或错误)静音。
在您的情况下,cmus-remote: cmus is not running
是stderr
,因此您应该使用的重定向应该能够重定向STDOUT
和STDERR
答案 1 :(得分:0)
你似乎遇到的实际问题是你的pgrep会在你不期待的时候回击。
pgrep cmus>& /dev/null
if [ $? -eq 0 ]; then
//statements here are not evaluated if pgrep\'s exit status is not equal to 0
您的pgrep退出代码=零。但它可能不是一个完全匹配(cmus)被发现。 尝试使用pgrep缩小搜索范围(即使用u或x标志)
提示:使用-X运行bash脚本以查看退出代码的实际内容,并将其与https://linux.die.net/man/1/pgrep上记录的退出代码进行比较
答案 2 :(得分:0)
关于cmus
是否正在运行以及cmus-remote
是否可以检索任何信息的最佳权限是cmus-remote
。因此,您只需将pgrep cmus
替换为cmus-remote
,因为如果cmus
,它将以退货代码1退出:
cmus-remote >& /dev/null
if [ $? -eq 0 ]; then
# stuff
fi
或者,您可以事先放弃检查并减少所调用的外部命令的数量。只是尝试解析输出cmus-remote -Q
并忽略stderr
上的输出:
#!/bin/zsh
cmus-remote -Q 2> /dev/null | awk '
BEGIN {
tags["album"] = "";
tags["artist"] = "";
tags["title"] = "";
tags["tracknumber"] = ""
}
$1 == "tag" && $2 in tags {
tag=$2;
$1=$2="";
sub(/ /,"");
tags[tag] = $0
}
END {
if (tag)
printf "%s %s - %s - %s\n", tags["tracknumber"], tags["title"], tags["artist"], tags["album"];
else
print ""
}'
这只调用cmus-remote
一次,将stdout
传递给awk
(也只调用一次)。如果cmus
未运行,则错误消息将传递给/dev/null
。 awk
然后解析cmus-remote -Q
的输出并创建所需的输出。如果cmus
未运行或没有标记,则会打印一个空字符串。