2014-09-28 21 views
-1

最近我真的搞砸了。我有這將互換的兩個文件的內容的函數:Bash完成「本地」變量後,tmp文件在哪裏?

function swap()   
{ 
    local TMPFILE=tmp.$$ 
    mv "$1" "$TMPFILE" 
    mv "$2" "$1" 
    mv "$TMPFILE""$2" 
}    ^

正如你可以看到右側不遠的地方胡蘿蔔指向一個空間丟失。 作爲運行下面的命令的結果:

$ swap important.txt not-important.txt 

原因important.txt到由未important.txt和important.txt被覆蓋被髮送到本地的bash變量的深淵/文件

是有沒有什麼選項可以抓取磁盤上的原始數據?

$ grep -a -A1000 -B1000 "some text from important.txt" /dev/disk0 
+0

查找/ tmp文件夾。有一點點運氣,你的操作系統會提供像/tmp/tmp.1234這樣的tmpfiles,或者從你的腳本中,我也會查看當前目錄,你的主目錄,你的路徑,文件名爲tmp。* – Pieter21 2014-09-28 23:02:42

+0

閱讀你的腳本,我假設TMPFILE = tmp。$$是一些bash內建的臨時文件。但顯然它只是將「tmp。」放入TMPFILE中。因此,臨時文件應位於執行命令的目錄中。壞消息是:如果在同一個shell會話中多次使用swap(),那麼臨時文件的名稱總是保持不變(因此在隨後的調用中內容會被覆蓋)... – misberner 2014-09-28 23:20:00

+1

爲了將來的參考,您希望'TMPFILE = $(mktemp)'來產生一個新的臨時文件名(在'/ tmp /'中默認),每次調用'swap'。另外,如果前一個成功,你只想執行每個'mv',並且(如果其中任何一個失敗,則可能會中止程序):'mv「$ 1」「$ TMPFILE」&& mv「$ 2」「$ 1」&& mv「 $ TMPFILE「」$ 2「|| {回聲「交換失敗」>&2;出口1; }'。 – chepner 2014-09-28 23:25:37

回答

2

這個問題沒有道理:Bash不會自動刪除文件,因爲它是用局部變量完成的。這個變量實際上只是一個保存文件名的字符串 - 它不是一個有意義的文件句柄。 (Bash 確實支持真實的文件句柄,通過使用重定向來打開文件並跟蹤關聯的FD或文件描述符,但是您的代碼在這裏不做任何事情)。


也就是說:

mv "$1" "$TEMPFILE" 

重命名文件已經存儲的TEMPFILE變量裏面的名字。你知道叫什麼名字,因爲你在該行之前立即指派方式:

local TMPFILE=tmp.$$ 

$$是當前shell的PID(或進程ID)...所以mv "$1" "$TEMPFILE"也已被寫入爲mv "$1" "tmp.$$"文件內容不存儲在局部變量中;只有該文件的名稱存儲在那裏。 Bash不會刪除該文件本身 - 但如果您再次從具有相同ID的進程的相同目錄中調用該函數,它將選擇相同的臨時文件名,並因此將覆蓋該文件的先前內容。


這樣:在你的函數swap的情況下,將離開周圍的文件在磁盤上與形式tmp.###,其中###是運行腳本的bash的實例的PID的名稱。如果您的內容仍然存在,它們將會放在一個名稱與該表單匹配的文件中。