如果进程正在运行,则运行zsh run命令

时间:2017-04-03 08:34:24

标签: bash zsh

如果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案例的输出。

3 个答案:

答案 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 runningstderr,因此您应该使用的重定向应该能够重定向STDOUTSTDERR

答案 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/nullawk然后解析cmus-remote -Q的输出并创建所需的输出。如果cmus未运行或没有标记,则会打印一个空字符串。