我最近搞砸了自己。我有一个函数,它将交换两个文件的内容:
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
答案 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运行脚本。如果您的内容仍然存在,则它们将位于名称与该表单匹配的文件中。