首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能将pgrep输出正确地用于bash脚本上的变量?

为什么我不能将pgrep输出正确地用于bash脚本上的变量?
EN

Unix & Linux用户
提问于 2019-03-19 21:04:08
回答 2查看 5.1K关注 0票数 5

我正在尝试创建一个脚本,如果它正在运行,那么退出compton;如果它没有运行,则启动它。我从man那里读到,如果找到了进程,它应该退出1,所以我试着制作一个使用它的脚本.然而,这只是不工作,它开始,如果它是关闭,但不关闭它。我做错什么了??

代码语言:javascript
复制
#!/bin/bash


status=$(pgrep compton 2>&1)

if [[ $status == 1 ]];
    then
        killall compton
    else
        exec compton -b
fi

echo $status
EN

回答 2

Unix & Linux用户

发布于 2019-03-19 22:00:56

您将在您的pgrep变量中获得status输出。这并不是你所期望的结果。

pgrep输出进程的进程it (PID),与您提供的模式相匹配。如果有一个进程的名称与compton匹配,那么$status将是该进程或这些进程的PID。pgrep还返回退出状态,但是命令替换不会将退出状态捕获为字符串。

在您的测试中,您将$status1进行比较。compton不太可能有PID 1。

如果要杀死任何存在的compton进程,如果不存在compton进程,则启动compton -b,则可以使用

代码语言:javascript
复制
#!/bin/sh

if ! pkill compton; then
    exec compton -b
fi

这使用了pkill的退出状态。pkill工具的工作方式与pgrep相当(它们通常是作为一对分布和安装的),但是pkill没有输出匹配进程的PID(比如pgrep ),而是向匹配进程发送TERM信号(默认情况下)。

if关键字使用与它一起使用的命令的退出状态。

!反转测试的意义,以便

  • 如果pkill compton成功,这意味着有一个或几个compton进程现在已经被终止,或者至少发出了信号,并且exec compton -b将不会被执行。
  • 如果pkill compton失败(没有与名称匹配的进程,或者pkill中有一些内部错误),则if语句的主体将调用您的exec compton -b,它将用运行compton -b所产生的进程替换D31进程。
票数 8
EN

Unix & Linux用户

发布于 2019-03-19 21:23:09

您应该控制将在$中的pgrep进程的退出状态?变量。或者检查存储pgrep输出的$status变量是否为f.e。非零长度字符串。问题中的脚本检查变量状态下的字符串是否为"1“。

所以

代码语言:javascript
复制
#!/bin/bash
pgrep compton >/dev/null

if [[ $? -eq 0 ]]
then
    killall compton
else
    exec compton -b
fi

代码语言:javascript
复制
#!/bin/bash
status=$(pgrep compton 2>&1)

if [[ -n "$status" ]]
then
    killall compton
else
    exec compton -b
fi
票数 6
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/507290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档