Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如果进程正在运行,则执行zsh run命令_Bash_Zsh - Fatal编程技术网

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

Bash 如果进程正在运行,则执行zsh run命令,bash,zsh,Bash,Zsh,如果CMU正在运行,我想从CMU remote获取一些信息 #!/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 //') a

如果CMU正在运行,我想从CMU remote获取一些信息

#!/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
运行中的CMU的输出是正确的,当CMU不运行时,我得到

cmus-remote: cmus is not running
cmus-remote: cmus is not running
cmus-remote: cmus is not running
cmus-remote: cmus is not running
-
我有一个解决办法,在每一行相应的行上附加>&/dev/null,但这不是我想要的,我希望代码根本不被执行。我不知道else案例的输出

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:CMU未运行的是一个stderr,因此您应该使用的重定向应该能够重定向STDOUT和stderr。您似乎遇到的实际问题是,您的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退出代码=零。但这可能不是一个精确匹配的CMU被发现。 尝试使用pgrep缩小搜索范围,即使用u或x标志


提示:使用-X运行bash脚本,查看退出代码实际是什么,并将它们与CMU是否正在运行以及CMU remote是否可以检索任何信息的最佳权威上记录的退出代码进行比较。因此,如果CMU:

CMU远程>&/dev/null 如果[$?-等式0];然后 东西 fi 或者,您可以事先放弃检查,减少调用的外部命令的数量。只需尝试解析输出cmus remote-Q并忽略stderr上的输出:

!/bin/zsh CMU远程-Q 2>/dev/null | awk' 开始{ 标签[相册]=; 标签[艺术家]=; 标签[标题]=; 标签[tracknumber]= } $1==标记&&$2在标记{ 标签=$2; $1=$2=; sub/,; 标签[标签]=$0 } 结束{ 如果标签 printf%s%s-%s-%s\n,标签[tracknumber]、标签[title]、标签[artist]、标签[album]; 其他的 打印 }'
这只调用CMU remote一次,将stdout管道传输到awk也只调用一次。如果CMU未运行,则错误消息将传递给/dev/null。awk然后解析CMU remote-Q的输出并创建所需的输出。如果CMU未运行或没有标记,它将打印一个空字符串。

检查下面的解决方案。在我的系统上测试!CMU remote的输出是什么样子的?几乎可以肯定的是,有一种更好的方法来解析这个问题,而不是多次调用cmusremote、grep和sed。输出看起来像标签标题空间殖民者,每个人在一个新的linepgrep中都返回了一个我没有预料到的结果。问题是我将shell脚本命名为cmus,而不是cmus.sh或其他名称。重命名并使用pgrep-x“cmus”解决了这个问题,我没有完全理解您使用-x运行脚本以查看退出代码的意思?我应该在壳里打什么?顺便说一句,实现这一点有多种方法。一个例子是:终端中的bash-xcmus.sh Hanks但我已经知道重定向,我确实提到了解决方法。甚至可以重定向/dev/null的输出。>/dev/null和>&/dev/null的区别在哪里?解决方案2不是比使用pgrep更糟糕吗?@rev我不知道>&但是&>文件名将stdout和stderr重定向到文件名。&>文件名与>文件名2>&1相同。想让您对此有一个清晰的认识,这就是为什么缩写重定向语法的原因。在>/dev/null的情况下,只有STDOUT被重定向到文件描述符1,这是Bash的默认值。如果您谈论的是第二个解决方案,那么还有比pgrep和ps更多的实用程序可以确认我们正在运行的进程。这个想法是向你传达你可以采用的方法。如果pgrep对你来说很舒服,那么一切都很好:工作起来很有魅力,哇。这是一些awk的大量使用,我到目前为止还没有研究过,这是我肯定要做的。