【问题标题】:Bash - how to write the output of a command into a variable and also get the commands pidBash - 如何将命令的输出写入变量并获取命令 pid
【发布时间】:2015-06-05 14:43:31
【问题描述】:

我需要获取命令的完整输出并获取它的 pid。问题是获取 pid 的工作方式如下:

(nmcli d wifi connect "$1" password "$2") & PID=$!

获取输出的工作方式如下:

output="$(nmcli d wifi connect $1 password $2)"

如何将这两者结合起来?

【问题讨论】:

  • 捕获输出后,我看不出 PID 有什么用处,因为此时子进程已不存在。

标签: bash shell process


【解决方案1】:

我认为最好的办法是使用临时文件:

f="${TMPDIR:-/tmp}/tmp.$$"
trap "rm $f" EXIT
nmcli d wifi connect "$1" password "$2" >"$f" &
nm_pid=$!

# ... do stuff

wait $nm_pid
# ... use contents of "$f"

(我在您的 $1 和 $2 周围添加了引号 - 在脚本中很少遇到过多的引用)。

【讨论】:

    【解决方案2】:

    这是无法做到的。您想在后台运行程序并将其输出同时捕获到一个变量中。如果这是可能的,那么变量的值将在后台程序执行期间发生变化,而无需您的显式命令。例如:

    output="$(nmcli d wifi connect $1 password $2)" &
    echo $output #maybe empty
    sleep 10
    echo $output #what now?
    

    在上面的脚本中,我们没有显式地更改“输出”变量的值(通过赋值)。但是,如果您询问的功能是可能的,那么变量的值将隐式更改(这很容易出错)。

    您可以通过将后台命令的输出重定向到文件来实现相同的功能。

    【讨论】:

    • 我实际上运行了“异步”逻辑。只捕获不可能的错误。
    【解决方案3】:

    你的意思是这样的吗?

    #/bin/env bash
    nmcli d wifi connect "$1" password "$2" > /tmp/$$.tmp &
    PID=$!
    wait
    output=$(</tmp/$$.tmp)
    ...
    

    【讨论】:

    • 是的,但是如果不写入 tmp 文件就不可能吗?
    • @RichiBurkhardt:我不这么认为。至少,我不知道怎么做。
    猜你喜欢
    • 2020-03-22
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2015-05-16
    • 2015-01-01
    • 2018-10-01
    相关资源
    最近更新 更多