在 Linux 上使用 Bash 創(chuàng)建一個(gè)臨時(shí)文件
使用 Bash 腳本語言進(jìn)行編程時(shí),有時(shí)需要創(chuàng)建一個(gè)臨時(shí)文件。例如,你可能需要一個(gè)可以提交到磁盤的中間文件,以便你可以使用另一個(gè)命令對其進(jìn)行處理。創(chuàng)建諸如 ??temp?
?? 之類的文件或任何以 ??.tmp?
?? 結(jié)尾的文件很容易。但是,這些名稱很可能是由其他進(jìn)程生成的,因此你可能會不小心覆蓋現(xiàn)有的臨時(shí)文件。除此之外,你不應(yīng)該花費(fèi)腦力想出看起來獨(dú)特的名字?;?Fedora 的系統(tǒng)上的 ??mktemp?
?? 命令和基于 Debian 的系統(tǒng)上的 ??tempfile?
? 是專門為減輕這種負(fù)擔(dān)而設(shè)計(jì)的,它使創(chuàng)建、使用和刪除獨(dú)特的文件變得容易。
創(chuàng)建一個(gè)臨時(shí)文件
??mktemp?
?? 和 ??tempfile?
? 都創(chuàng)建一個(gè)臨時(shí)文件作為它們的默認(rèn)操作,并打印文件的名稱和位置作為輸出:
$ tempfile
/tmp/fileR5dt6r
$ mktemp
/tmp/tmp.ojEfvMaJEp
除非你指定不同的路徑,否則系統(tǒng)會將臨時(shí)文件放在 ??/tmp?
? 目錄中。
對于 ??mktemp?
??,可以使用 ??-p?
? 選項(xiàng)指定路徑:
$ mktemp -p ~/Demo
/home/tux/Demo/tmp.i8NuhzbEJN
對于 ??tempfile?
??,可以使用 ??--directory?
?? 或 ??-d?
? 選項(xiàng):
$ tempfile --directory ~/Demo/
/home/sek/Demo/fileIhg9aX
找到你的臨時(shí)文件
使用自動生成的臨時(shí)文件的問題是你無法知道它的名字是什么。這就是為什么兩個(gè)命令都返回生成的文件名作為輸出的原因。你可以使用 Konsole、GNOME 終端或 ??rxvt?? 等交互式 shell 來使用終端上顯示的文件名與文件進(jìn)行交互。
但是,如果你正在編寫腳本,則無法通過讀取文件名并在以下命令中使用它來進(jìn)行干預(yù)。
??mktemp?
?? 和 ??tempfile?
? 的作者想到了這個(gè)問題,并且有一個(gè)簡單的解決方法。終端將輸出發(fā)送到名為“標(biāo)準(zhǔn)輸出”的流。你可以通過將變量設(shè)置為在子 shell 中啟動的命令的結(jié)果來捕獲標(biāo)準(zhǔn)輸出:
$ TMPFILE=$(mktemp -p ~/Demo)
$ echo $TMPFILE
/home/tux/Demo/tmp.PjP3g6lCq1
引用文件時(shí)使用 ??$TMPFILE?
?,它與直接與文件本身交互相同。
使用 mktemp 創(chuàng)建一個(gè)臨時(shí)目錄
你還可以使用 ??mktemp?
? 命令創(chuàng)建目錄而不是文件:
$ mktemp --directory -p ~/Demo/
/home/tux/Demo/tmp.68ukbuluqI
$ file /home/tux/Demo/tmp.68ukbuluqI
/home/tux/Demo/tmp.68ukbuluqI: directory
自定義臨時(shí)名稱
有時(shí)你甚至可能希望在偽隨機(jī)生成的文件名中加入可預(yù)測性元素。你可以使用這兩個(gè)命令自定義臨時(shí)文件的名稱。
使用 ??mktemp?
?,你可以為文件名添加后綴:
$ mktemp -p ~/Demo/ --suffix .mine
/home/tux/Demo/tmp.dufLYfwJLO.mine
使用 ??tempfile?
?,你可以設(shè)置前綴和后綴:
$ tempfile --directory ~/Demo/ --prefix tt_ --suffix .mine
/home/tux/Demo/tt_0dfu5q.mine
把 tempfile 作為 touch 使用
你還可以使用 ??tempfile?
? 設(shè)置自定義名稱:
$ tempfile --name not_random
not_random
當(dāng)你使用 ??--name?
?? 選項(xiàng)時(shí),它是絕對的,忽略所有其他形式的自定義。事實(shí)上,它甚至忽略了 ??--directory?
? 選項(xiàng):
$ tempfile --directory ~/Demo --prefix this_is_ --suffix .all --name not_random_at
not_random_at
在某種程度上,??tempfile?
?? 可以替代 ??touch?
?? 和 ??test?
?,因?yàn)樗芙^創(chuàng)建已經(jīng)存在的文件:
$ tempfile --name example.txt
open: file exists
??tempfile?
?? 命令并非默認(rèn)安裝在所有 Linux 發(fā)行版上,因此在將其用作腳本中的 ??test?
? 的 hack 之前,你必須確保它存在。
安裝 mktemp 和 tempfile
??GNU Core Utils??? 包括 ??mktemp?
?? 命令。主要發(fā)行版默認(rèn)包括 Core Utils(它是包含 ??chmod?
??、??cut?
??、??du?
? 和其他基本命令的同一個(gè)軟件包)。
Debian Utils 軟件包包含 ??tempfile?
? 命令,默認(rèn)安裝在大多數(shù)基于 Debian 的發(fā)行版和 Slackware Linux 上。
總結(jié)
臨時(shí)文件很方便,因?yàn)椴粫煜鼈兪欠窨梢园踩珓h除。它們是臨時(shí)的,意在根據(jù)需要使用并毫不猶豫地丟棄。在需要時(shí)使用它們,并在完成后清除它們。