读取命令输出的第一行。命令将我连接到远程终端

读取命令输出的第一行。命令将我连接到远程终端

第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

这是针对 的bashzsh可能有点不同:

#!/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

相关内容