Ack in bash subshel​​l

时间:2017-06-29 20:45:40

标签: bash ack

我想在“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选项解决了它。根据{{​​1}}消息,它强制ack将stdin视为tty而不是pipe。我想知道这意味着什么。

1 个答案:

答案 0 :(得分:2)

由于某种原因,它似乎不喜欢stdin上的管道。 我不知道为什么会这样,但快速简单的解决办法是:

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

或在你的情况下

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