shell包装器根据其输出重启脚本

问题描述 投票:1回答:1

我有一些shell脚本练习从其他程序读取管道输入,但我不确定如何解决这个问题。

背景

我无法真正修复/修改内部的程序robinbotter从文件equities.sym和blacklist.sym获取其输入,每个简单的文本文件每行包含一个股票代码。

当它运行正常时,其输出产生:

...
Downloading instruments: [ AFL KELYB LFUS ] 
...

当它因内部错误而中断时,

...
Downloading instruments: [ AFL KELYB LFUS LNVGY 

并停止那里,没有进一步的输出,产生退出代码0,就像在好的情况下(不幸的是)。

在程序处理它们时,打印机符号会稍微延迟打印 - 两者之间没有换行符。

当它遇到LNVGY或不可预测的任何其他许多可能性时,它会以某种方式无法处理或至少跳过它们,而是在没有适当的异常或错误代码的情况下崩溃。

问题

我正在尝试在BASH中编写一个简约的包装脚本(例如retryRB.sh ./robinbotter),其中:

  1. 以某种方式监视robinbotter的实时无缓冲输出,使用正则表达式或其他方法检测包含“下载工具:[”的行在程序结束前何时不以“]”结尾输出。在这种情况下:
  2. 取出打印出来的最后一个符号(例如LNVGY),将程序崩溃并将其附加到文件blacklist.sym的底部。喜欢 echo $ lastSymbol >> blacklist.sym
  3. 重新启动程序robinbotter,保留其原始命令行参数:$ @

我熟悉像awk和sed这样的工具,如果Bash没有削减它,我会很乐意在Ruby中构建一个简短的解决方案。

regex bash wrapper io-redirection
1个回答
2
投票

在这里,您有一个Bash版本的代码,可以模仿二进制文件的功能。然后你有一个包装器,它会在应用程序成功完成时记录,并在失败时记录。如果失败,它还会附加最后打印的项目,如下图所示(在这种情况下,我在Bomb上强硬编码失败!和Boom!但你明白了):

main.sh

#!/bin/bash

some=('Pera' 'Manzana' 'Frutilla' 'Durazno' 'Banana' 'Lechuga' 'Sandia' 'Papa' 'Melon' 'Milanesa' 'Bomb!' 'Boom!')

printf 'Downloading instruments: [ '
for (( i=1 ; i < 5 ; i++ )) {
        item=${some[$( shuf  -i 0-$((  ${#some[@]} - 1 )) -n 1 )]}
        printf "$item"
        [[ $item == 'Bomb!' || $item == "Boom!" ]] && exit || printf "$item"
        [[ $i -lt 4 ]] && printf ' '
}
printf ' ]'

wrapper.是

#!/bin/bash

while :
do
        res=$( ./main.sh )
        [[ ! "$res" =~ \[[^]]*\] ]] && printf "Failure : ${res##*[\[ ]}" ||  printf "Success"
        printf '\n'
        sleep 1
done

enter image description here

您可以测试这些脚本,然后将您的二进制文件放在main.sh的位置。问候!

© www.soinside.com 2019 - 2024. All rights reserved.