在Bash子shell中的Ack

3

我希望在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 将 stdin 视为 tty 而不是管道。我想知道这意味着什么。


你可以将你的编辑变成一个合适的回答。 - janos
1个回答

2

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

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

或者针对你的情况
 # get data:
 {
     #....
 } </dev/null

谢谢。在阅读了您的答案后,我重新阅读了 --help 信息,并发现 --nofilter 选项适用于我的用例。 - Adobe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接