2017-06-29 3 views
2

"bash loopの中の"いくつかのファイルを検索したい。bashサブシェルでAck

私はbashのループにACK検索をexecしたとします

#!/bin/bash 

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

プリント1つの空行を。

#!/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によると、stdinはパイプではなくttyとして扱われます。私はこれが何を意味するのだろうか。

+0

あなたの編集正しい答え – janos

答えて

1

何らかの理由でstdinのパイプが気に入らないようです。 それはない、なぜ私は知らないが、迅速かつ簡単な修正は次のようになります。

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

またはあなたのケースで

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

おかげで作ることができます。あなたの答えを読んだ後、私は '--help'メッセージを読み直し、' --nofilter'オプションが私のusecaseのために働くことを知りました。 – Adobe

関連する問題