【问题标题】:Ack in a bash subshell在 bash 子外壳中确认
【发布时间】:2017-06-29 20:45:39
【问题描述】:

我想“在 bash 循环中”搜索多个文件。

假设我在 bash 循环中执行 ack 搜索:

#!/bin/bash

seq 3 | while read i
do
    test=`ack root /etc/passwd`
    echo $test
done

打印一个空行。

在哪里

#!/bin/bash

seq 3 | while read i
do
    # test=`ack root /etc/passwd`
    echo $test
done

打印 3 个空行。

如果我从 bash 中只运行一个命令,它就可以工作:

ack root /etc/passwd

这也有效:

$ test=`ack root /etc/passwd`
$ echo $test

我认为 ack 以某种方式打破了循环。

这里是“问题的根源”:

ls input/* | while read scan
do
    temp=`basename "$scan"`
    baseName=${temp%.*}
    extension=${temp#*.}

    # OCR:
    abbyyocr11 -rl Russian -if "$scan" -f TextUnicodeDefaults -of "temp/$baseName.txt"

    # get data:
    firstName=` ack '^Имя\s+(.+)'      --output='$1' "temp/$baseName.txt" | sed 's/ //g'`
    middleName=`ack '^Отчество\s+(.+)' --output='$1' "temp/$baseName.txt" | sed 's/ //g'`
    lastName=`  ack '^Фамилия\s+(.+)'  --output='$1' "temp/$baseName.txt" | sed 's/ //g'`

    # copy the file with a meaningful name:
    cp --backup=numbered "$scan" "output/$lastName$firstName$middleName.$extension"

done

编辑

原来--nofilter 选项解决了它。根据--help 消息,它强制 ack 将标准输入视为 tty 而不是管道。我想知道这意味着什么。

【问题讨论】:

  • 你可以让你的编辑成为一个正确的答案

标签: bash ack


【解决方案1】:

由于某种原因,它看起来不喜欢标准输入上的管道。 我不知道为什么会这样,但一个快速简单的解决方法是:

seq 3 | while read i
do
    test=`</dev/null ack root /etc/passwd`
    echo $test
done

或者在你的情况下

 # get data:
 {
     #....
 } </dev/null

【讨论】:

  • 谢谢。阅读您的答案后,我重新阅读了--help 消息,发现--nofilter 选项适用于我的用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多