簡體   English   中英

刪除文件時循環bash並不會結束

[英]bash while loop through a file doesn't end when the file is deleted

我在bash腳本中有一個while循環:

例:

while read LINE
do
echo $LINE >> $log_file
done < ./sample_file

我的問題是為什么當我在腳本運行時刪除sample_file時,循環沒有結束並且我看到log_file正在更新? 沒有輸入時循環如何繼續?

在unix中,只有在刪除文件的最后一個目錄條目(例如,使用rm關閉文件的最后一個打開的文件句柄之后,該文件才真正被刪除。 有關更多信息,請參見此問題 (尤其是MarkR的答案)。 在你的腳本的情況下,打開文件作為標准輸入的while read循環,直到循環退出(或關閉它的標准輸入), rm荷蘭國際集團的文件將不會真正刪除它關閉磁盤。

如果需要,您可以輕松看到這種效果。 打開三個終端窗口。 首先,運行命令cat >/tmp/deleteme 在第二個命令中,運行tail -f /tmp/deleteme 在第三個命令中,運行其他兩個命令后,運行rm /tmp/deleteme 至此,文件已經取消鏈接,但是cattail進程都為其打開了文件句柄,因此實際上尚未刪除它。 您可以通過在第一個終端窗口(運行cat )中鍵入來證明這一點,並且每次您的命中返回時, tail都會看到新行添加到文件中並在第二個窗口中顯示。

在您結束這兩個命令之前,該文件實際上不會被刪除(Control-D將結束cat ,但是您需要Control-C殺死tail )。

請參見“為什么在unix中刪除后可以訪問文件?” 很好地解釋了您在這里觀察的內容。

簡而言之...

rm和潛在的刪除文件的任何其他命令的基礎是系統調用取消鏈接。 它被稱為取消鏈接,而不是刪除或刪除文件或類似的東西,因為它不會刪除文件。 它刪除一個鏈接(又名目錄條目),該鏈接是文件和目錄中名稱之間的關聯。

您可以使用該功能truncate摧毀實際內容(或shred ,如果您需要更安全的),這將立即停止你的例子循環的執行。

在shell執行while循環的那一刻, sample_file內容已被讀取,在該點之后文件是否存在並不重要。

測試腳本:

$ cat test.sh 
#!/bin/bash

while read line
do
    echo $line
    sleep 1
done < data_file

測試文件:

$ seq 1 10 > data_file

現在,在一個終端上運行腳本,在另一終端上,運行並刪除文件data_file ,您仍然會看到腳本打印的1到10數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM