【问题标题】:how do I use bash to combine two STDOUT message streams in one read operation?如何使用 bash 在一次读取操作中组合两个 STDOUT 消息流?
【发布时间】:2021-11-02 16:57:09
【问题描述】:

我已经编写了我的第一个 bash 脚本,它可以挽救目前存储在大量 8 英寸软盘上的 6800 个历史性 mdos 文件。该脚本为可执行文件提供参数,该文件 [a] 列出磁盘映像上的文件,然后 [b] 逐个获取每个文件并将其保存到硬盘驱动器上的目录中。可执行文件是从source code written by Joseph H Allen 编译的。

    C:/TEST/mdos.exe floppy.img ls -1 > filelist                             # list filenames one per line ;
    while read -r name; do
    echo -e "${name}"
    C:/TEST/mdos.exe floppy.img get $name C:/TEST/MDOS/$name > loadstart     # capture load & start addresses
    done < filelist

此处显示从单个软盘映像成功恢复的文件。

我现在正试图通过捕获脚本运行时出现在屏幕上的两个交错的stdout 字符串来记录归档过程。这些字符串来自运行可执行文件的两个单独的行。

第一个列出了在磁盘映像上找到的所有文件名,以响应在运行时提供给mdos.exels 参数。每个文件名出现在连续的行中。

    C:/TEST/mdos.exe floppy.img ls -1

第二个显示一些 mdos 6800 命令文件在运行时使用的加载和起始地址。

    C:/TEST/mdos.exe floppy.img get $name C:/TEST/MDOS/$name

在屏幕上两个流是这样交错的

    a.lo
    Load=$2000, Start=$2000
    a.sa
    ad571.cm
    Load=$6000, Start=$6000
    sd571c.sa
    b2716.cm
    Load=$2000, Start=$2002
        ...

每当有加载地址起始地址消息时,如果它与报告它的文件出现在同一行,那么在打印的日志中会更有意义,就像这样

所需格式

    a.lo      Load=$2000, Start=$2000
    a.sa
    ad571.cm  Load=$6000, Start=$6000
    ad571c.sa
    b2716.cm  Load=$2000, Start=$2002
    ...

到目前为止,我已经设法将第一个 stdout 流保存到文件中,但没有保存第二个。

虽然我理解避免 ls 在帖子 here herehere 中出现的论点,但我的脚本中当前有效的部分使用 ls,这是 mdos.exe 所需的论点。不幸的是,它恰好拼写相同,并且在功能上类似于 Linux 中的ls。我真的不知道这是否导致了明显的问题:如何捕获加载和起始地址。最终,我需要捕获两个stdout 流并以所需的打印格式(上方)将它们呈现在同一行。查看帖子 here here herehere 似乎我应该使用关联数组来执行此操作,而不是编写两个单独的文件。

如果这是进行的最佳方式,如何将其作为单个循环来完成?还是应该使用单独的循环来捕获每个流?

【问题讨论】:

  • 太棒了echo -ne "${name} "?同样&gt;覆盖每个循环的文件,使用&gt;&gt;追加到文件。
  • 好点。这可以很好地隐藏问题。检查
  • 好建议。 &gt;&gt; 没有区别,但 /n 选项肯定会通过一些调整来解决这个问题。这是它给出的 a.loLoad=$2000, Start=$2000 a.saad571.cmLoad=$6000, Start=$6000 ad5713.cmLoad=$6000, Start=$6000 ad571c.sab2716.cmLoad=$2000, Start=$2002 如果你愿意发布答案我会接受它

标签: linux bash stdout


【解决方案1】:

您似乎想要:

while IFS= read -r name; do
       echo -ne "${name} "
       # capture load & start addresses
       C:/TEST/mdos.exe floppy.img get "$name" "C:/TEST/MDOS/$name"
done < filelist > loadstart

使用 shellcheck.net 检查您的脚本。

您可以使用 printf "%-20s" "$name" 来更好地抵消它。

【讨论】:

  • 我将空格设为 '\t',因此文件名与加载和起始地址消息保持在单独的列中。非常感谢
猜你喜欢
  • 2021-07-05
  • 2011-01-12
  • 2017-10-05
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 2016-11-29
  • 2013-12-12
  • 2016-05-04
相关资源
最近更新 更多