2013-12-18 80 views
0

我想我在這裏推動了bash的限制,但是我真的想要完成這個工作而不必重新編寫整個腳本。bash文件逐行讀取;同時允許交互式stdin?

我有一些動態的東西是我想要對其執行操作的文件對列表。我還想在繼續執行任何任務之前提示。

它看起來像這樣:

diff -rq $dir1 $dir2 | \ 
    sed -ne 's/^Files \(.*\) and \(.*\) differ$/\1 \2/p' | \ 
    while read differingfilepair; do 
     ... 
     printf "Continue? (Y/n)" 
     read -n1 cont 
    done 

正如你可以在這裏看到的while read line塊似乎充當某種形式的接收標準輸入的數據內容的子shell的。

$cont變量基本上只是吸食該數據的每一行的第一個字符(在該對中diff報道爲不同的文件的第一文件的路徑中的第一個字符),它不連接到該終端。

有沒有辦法做我想在這裏做的事情?我想一個解決方法是使用臨時文件,但有另一種方式嗎?

編輯:使用以後加載到while read塊像這樣的臨時文件:while read l; do ...; done < .tmp_file仍然接管標準輸入! (雖然我認爲this answer會幫助)

+0

是的,似乎是這個問題的文件描述符重定向方法的等式的一部分...雖然這是有點超越我。我最終利用了數據的結構性,並通過簡化列表並使內部循環跟蹤狀態。在'cat file'中使用'for file''' –

回答

1

在bash文件描述符1是標準輸入可能重複,2是標準錯誤,並且9之後可以被內部shell進程使用。 (從bash的手冊頁)(見http://mywiki.wooledge.org/BashFAQ/089的例子)

Redirections using file descriptors greater than 9 should be used with 
care, as they may conflict with file descriptors the shell uses inter‐ 
nally. 

所以您可以讀取文件到3-9例如(取代回聲,但你正在獲取文件)

for file in $(echo "file1.txt file2.txt"); do 
    while IFS='' read differingfilepair <&3; do 
    ... 
    printf "Continue? (Y/n)" 
    read -n1 cont 
    done 3< "$file" #Or some command that gets file names 
done 
+0

非常好。你還可以注意到如何使用不同的文件描述符來將東西輸入到'while'中? –

+1

完美的答案。唯一的批評是,TLDP可能不是最好的參考點,因爲它往往是過時的或不準確的。 http://mywiki.wooledge.org/BashFAQ/089是另一個直接指向的參考。 –

+0

@Steven Lu你需要管它嗎?當我第二次嘗試時得到一個錯誤的文件描述符警告。我相信有一些神奇的方式來獲得它,但可能更容易順序重定向他們。 – BroSlow