2008-09-16 30 views
109

我曾經讀過一種獲取臨時文件的shell中唯一文件名的方法,就是使用雙美元符號($$)。這確實會產生一個不時變化的數字......但如果您重複地調用它,它將返回相同的數字。 (解決的辦法就是使用時間。)

我很想知道$$究竟是什麼,以及爲什麼會建議它作爲生成獨特文件名的方法。

回答

69

在Bash中$$是進程ID,如註釋中所述,由於各種原因,它不可安全地用作臨時文件名。

對於臨時文件名,請使用mktemp命令。

+33

誰的人只是看看上面的回答,$$是不是罰款,甚至一個單一的文件,如果寫一個公開,可寫目錄(例如,/ tmp)中。亂扔/ tmp符號鏈接會很容易,這會導致您的腳本寫入某個不需要的地方。 mktemp好得多。 – 2008-09-17 00:11:25

+4

是的,使用$$會導致一個討厭的安全漏洞。不要這樣做。 – emk 2008-09-17 00:14:21

14

$$是當前進程的ID。

2

$$是當前shell進程的pid。這不是生成獨特文件名的好方法。

1

這是bash進程的進程ID。沒有併發進程會擁有相同的PID。

6

類UNIX操作系統中的每個進程都有一個(臨時)唯一標識符PID。同時運行的兩個進程不能有相同的PID,$$指的是運行該腳本的bash實例的PID。

這是非常多的而不是一個獨特的idenifier,它永遠不會被重用(事實上,PID不斷重複使用)。它給你的是一個數字,如果另一個人運行你的腳本,他們將得到一個不同的標識符,而你的腳本仍在運行。一旦你的死亡,PID可能會被回收,其他人可能會運行你的腳本,獲得相同的PID,所以得到相同的文件名。

因此,只有說「$$給出的文件名如果其他人運行相同的腳本,並且我的實例仍在運行,它們將得到不同的名稱」才真正理解。

1

$$是運行腳本的shell的進程ID。有關更多詳細信息,請參閱sh或bash的手冊頁。手冊頁可以使用命令行「man sh」或通過在網上搜索「shell手冊頁」找到。

4

$$是您的PID。它並不真正生成一個唯一的文件名,除非你非常小心,沒有其他人以完全相同的方式進行操作。

通常你會創造這樣的/ tmp/myprogramname $$

有這麼多的方式來打破這一點,如果你正在寫的位置其他人可以寫這不是很多太難操作系統可以預測你將要擁有的PID,並假設你正在以root身份運行,並且創建/ tmp/yourprogname13395作爲指向/ etc/passwd的符號鏈接 - 然後寫入它。

這是在shell腳本中做的壞事。如果你打算使用臨時文件來做某件事,你應該使用更好的語言,至少讓你添加打開(創建)文件的「獨佔」標誌。那麼你可以肯定你不會破壞別的東西。

1

$$是運行腳本的shell解釋器的pid(進程ID)。現在在系統上運行的每個進程都有所不同,但隨着時間的推移,pid將會環繞,並且在您退出之後,最終會有另一個具有相同pid的進程。只要你跑步,這個pid對你來說是獨一無二的。

從上面的定義可以明顯看出,無論您在腳本中使用多少次$$,它都會返回相同的數字。

您可以使用,例如, /tmp/myscript.scratch.$$作爲臨時文件,用於不需要非常可靠或安全的事物。這是在腳本的末尾刪除這些臨時文件一個很好的做法,例如使用,trap命令:

trap "echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT 
91

$$是在bash進程ID(PID)。使用$$是一個壞主意,因爲它通常會創建競爭條件,並允許攻擊者破壞你的shell腳本。例如,看到所有these people誰創建了不安全的臨時文件並且必須發佈安全公告。

取而代之,使用mktempLinux man page for mktemp非常好。下面是它的一些示例代碼:

tempfoo=`basename $0` 
TMPFILE=`mktemp -t ${tempfoo}` || exit 1 
echo "program output" >> $TMPFILE 
1

讓我第二個emk的答案 - 不要使用$$本身作爲「唯一」任何東西。對於文件,使用mktemp。對於同一bash腳本中的其他ID,請使用「$$$(date +%s%N)」作爲合理的唯一性的好機會。

-k 
0

此外,您可以通過此命令抓登錄用戶名。例如。

echo $(</proc/$$/login id). After that, you need to use getent command. 
相關問題