如何在后台执行 运行 命令并捕获输出
How to run command in background and also capture the output
在脚本的中间,我有一个暴露本地端口的命令 ssh -R 80:localhost:8080 localhost.run
我需要在后台执行这个命令,解析输出并将其保存到一个变量中。
输出returns:
Welcome to localhost.run!
...
abc.lhrtunnel.link tunneled with tls termination, https://abc.lhrtunnel.link
需要捕捉这部分:
https://abc.lhrtunnel.link
结果是这样的:
...
hostname=$(command)
echo $hostname
...
试试这个 Shellcheck-干净的代码:
#! /bin/bash -p
hostname=$(ssh ... \
| sed -n 's/^.*tunneled with tls termination, //p')
declare -p hostname
- 我假设您真的不想将生成输出的命令置于后台。您只想以一种允许捕获和过滤其输出的方式 运行 它。有关如何使用“后台”进程进行并行处理的信息,请参阅 How do you run multiple programs in parallel from a bash script?。
sed
的 -n
选项意味着它不会从输入中打印行,除非明确指示打印。
s/^.*tunneled with tls termination, //p
适用于包含任何后跟字符串 tunneled with tls termination,
的输入行。它删除该行中直到该字符串末尾的所有内容并打印结果,希望它是您想要的 URL。
declare -p varname
比 echo
. 更可靠和有用的显示变量值的方法
在脚本的中间,我有一个暴露本地端口的命令 ssh -R 80:localhost:8080 localhost.run
我需要在后台执行这个命令,解析输出并将其保存到一个变量中。
输出returns:
Welcome to localhost.run!
...
abc.lhrtunnel.link tunneled with tls termination, https://abc.lhrtunnel.link
需要捕捉这部分:
https://abc.lhrtunnel.link
结果是这样的:
...
hostname=$(command)
echo $hostname
...
试试这个 Shellcheck-干净的代码:
#! /bin/bash -p
hostname=$(ssh ... \
| sed -n 's/^.*tunneled with tls termination, //p')
declare -p hostname
- 我假设您真的不想将生成输出的命令置于后台。您只想以一种允许捕获和过滤其输出的方式 运行 它。有关如何使用“后台”进程进行并行处理的信息,请参阅 How do you run multiple programs in parallel from a bash script?。
sed
的-n
选项意味着它不会从输入中打印行,除非明确指示打印。s/^.*tunneled with tls termination, //p
适用于包含任何后跟字符串tunneled with tls termination,
的输入行。它删除该行中直到该字符串末尾的所有内容并打印结果,希望它是您想要的 URL。declare -p varname
比echo
. 更可靠和有用的显示变量值的方法