需求:把找到的文件逐行輸出,然後用rm在許可的情況下刪除前置準備:$lsrm.sh test1 test2 test3 test4 test5 test6$cat rm.sh#! /bin/bashwhile read fileinfodo rm -iv $fileinfodone< <( ...
需求: 把找到的文件逐行輸出,然後用rm在許可的情況下刪除 前置準備:
$ls rm.sh test1 test2 test3 test4 test5 test6
$cat rm.sh #! /bin/bash while read fileinfo do rm -iv $fileinfo done< <( find . -name 'test*' -print )
第一次執行結果:
$bash rm.sh rm:是否刪除普通文件“./test2”?
出現的問題:
雖然rm顯示了詢問信息,卻並不關心我輸入的是什麼(就沒給我機會),也沒有刪除文件
第一次結果分析: rm -iv需要從標準輸入中獲取允許,但標準輸入已經被重定向為’done< <( find $path -type f -print )‘,所以rm只能從這獲取輸入了,也造成了這一次執行的令就無效了,然後read和rm就不斷地逐次消耗掉輸入的行,也就什麼都沒做了; 第二次前置準備:$ls rm2.sh test1 test2
$cat test1 test1 test2 test3 test4 test5 test6程式解釋: 當每次read到的內容不為空就輸出到屏幕,count統計的是嘗試的刪除次數
$cat rm2.sh #! /bin/bash count=0 while read info do if [ ! -z info ] then echo $info:not null fi rm -iv test2 let count++ echo $count done< test1
第二次執行結果:
$bash rm2.sh test1:not_null rm:是否刪除普通文件 “test2”?1 test3:not_null rm:是否刪除普通文件 “test2”?2 test5:not_null rm:是否刪除普通文件 “test2”?3驗證分析: 符合第一次結果分析的猜測; 解決方案: 將原標準輸入(鍵盤輸入)存放在新的文件描述符中,併在rm中將新的文件描述符作為它的輸入 修正後的程式:
$cat rm3.sh #! /bin/bash exec 3<&0 while read fileinfo do rm -iv $fileinfo <&3 done< <( find . -type f -print )順帶一提: 'done< <( find . -type f -print )'有兩個‘<’的原因: 第一步:‘<( find . -type f -print )’相當於將子shell中的結果輸出到一個臨時文件 第二步:‘done< temp_file’從臨時文件中獲取輸入