在Bash用" local"完成后,tmp文件在哪里发生?变量?

时间:2014-09-28 23:01:16

标签: bash zsh local-variables tmp file-recovery

我最近搞砸了自己。我有一个函数,它将交换两个文件的内容:

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

正如你可以看到胡萝卜指向的地方附近,空间不见了。 结果运行以下命令:

$ swap important.txt not-important.txt

导致important.txt被not-important.txt覆盖,并且important.txt被发送到本地bash变量/文件的深渊

是否有任何选项无法抓取磁盘上的原始数据?

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

1 个答案:

答案 0 :(得分: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运行脚本。如果您的内容仍然存在,则它们将位于名称与该表单匹配的文件中。