第1部分
my_command
假设我有一个输出多行的命令。
我想my_command
在脚本中准备好后立即捕获 的输出的第一行,同时保持my_command
运行。
我认为这样的事情会起作用:
# Get a code that `my_command` prints in its first line
parsed_first_line=`my_command | grep -oEe '[0-9]+'`
echo 'Here is the first line ' $parsed_first_line
但事实并非如此。 echo 语句只有在完全完成后才会到达my_command
,这不是我想要的。
第2部分
深入了解:Imaginemy_command
实际上是一个将我的 shell 连接到远程 shell 的命令。这会以任何方式改变我们的解决方案吗第1部分?
如果细节很重要,my_command
实际上是一行命令:
bsub /bin/zsh
。
这是一个Platform LSF
将作业从登录计算机(在我们的例子中是交互式 zsh shell)提交到远程网格的命令。一旦提交的作业在网格上获得一个空位,LSF 就会调度它,在远程计算机上为我提供一个交互式 shell。
第一件事bsub
是将job ID
我的作业输出到远程队列上(这是我希望在脚本中解析的内容),然后一旦插槽打开,它就会调度我的作业。
我想知道是否有一个简单的解决方案 第1部分会为第2部分
答案1
您通常read
一次获取一行输入。你可以这样做:
my_command | {
read line
line=$(grep -oEe '[0-9]+');
if [ $line ]; then
echo 'Here is the first line ' $line
fi
#possibly read more from my_command, transfer control to another program via `exec`, etc...
}
答案2
为什么不直接通过管道连接到 head -1 呢?
# Get a code that `my_command` prints in its first line
# parsed_first_line=`my_command | grep -oEe '[0-9]+'`
parsed_first_line=$( my_command | head -1 | grep -oEe '[0-9]+' )
echo 'Here is the first line ' $parsed_first_line
这也让 my_command 完成,但它只返回第一行,然后它可以与您的 grep 进行匹配。
答案3
这是针对 的bash
,zsh
可能有点不同:
#!/bin/bash
# We'll need a temporary file.
TMPFILE=`mktemp`
# Start the process in the background
my_command > $TMPFILE &
# Get its pid so we can clean up that temp file later.
PID=$!
# Wait for the first line of output
first_line=`head -n1 $TMPFILE | grep -oEe '[0-9]+'`
while [ -z "$first_line" ]; do
# Don't technically need this, but it'll prevent the system from grinding.
sleep 1
first_line=`head -n1 $TMPFILE | grep -oEe '[0-9]+'`
done
echo Result: "$first_line"
# Clean up that temp file.
wait $PID
rm $TMPFILE