我开始为我的项目编写一些 bash 脚本,它们需要编写一些中间文件或变量。
我想知道当有人运行我的脚本时我可以确定可以访问哪些文件夹?这是一种常见的做法吗/tmp/
?或者我应该使用其他东西?
答案1
答案2
如果您需要编写一些仅在脚本或应用程序运行期间持续存在的临时文件,请使用TMPDIR
环境变量,或者如果未定义该变量,/tmp
.
/tmp
在某些系统上,它会在引导时被清除(有时甚至在 RAM 中,例如在 Solaris 上和某些 Linux 安装上默认情况下),因此它不能用于必须在电源故障或重新引导后幸存下来的文件。/var/tmp
可用于必须在重新启动后幸存下来的文件,但系统管理员可能会不时清理这些文件。如果您的应用程序需要永久保存文件,请将它们写入用户主目录中的某个位置(在~/.programmingnoobsapp
或 中~/.cache/programmingnoobsapp
)或在/var/lib/programmingnoobsapp
或下/var/cache/programmingnoobsapp
。
请注意,该文件/tmp
在所有用户之间共享,因此您在此处创建文件时需要采取预防措施。您需要选择一个尚不存在的文件名,并且需要小心,不要允许出现竞争条件,即另一个进程以不同的权限在您之前创建该文件,这可能是一个安全漏洞(如果另一个进程以不同的用户身份运行,然后它可以访问和修改您的进程的数据)。使用mktemp
/tmp
命令在或中创建文件/var/tmp
。默认情况下,mktemp
在 中创建一个文件$TMPDIR
,或者/tmp
如果TMPDIR
未设置,这通常是正确的位置。如果您需要使用多个临时文件,或者即使您需要一个临时文件,我建议您为所有临时文件创建一个目录,mktemp -d
并在脚本末尾将其删除。
#!/bin/sh
tmp_root=
trap 'rm -rf "$tmp_root"' EXIT INT TERM HUP
tmp_root=$(mktemp -d)
tmpfile1=$tmp_root/file1
tmpfile2=$tmp_root/file2
…
答案3
只是为了补充迄今为止已经发布的答案。
在一些 Linux 发行版上也有/dev/shm
可用于临时存储的。仅当文件 I/O 性能是文件系统/dev/shm
使用的关键因素时才应使用此存储tmpfs
。它还应该用于大小合理的文件和数据。文件系统tmpfs
使用系统 RAM 作为存储,因此它从启动到启动都不是持久的。
StackOverflow 上以及标题为以下的问答中对这里提到的所有选择都有一个很好的概述:Linux 上临时文件存储的 /tmp 与 /dev/shm 比较?。这个超级用户问答很好地涵盖了这一点,标题为:什么时候应该使用/dev/shm/,什么时候应该使用/tmp?。
参考
答案4
是的,/tmp
主要用于临时需要的文件。 /tmp 有粘性位,这意味着只有项目的所有者、目录的所有者或超级用户可以重命名或删除文件。许多程序使用它来创建锁定文件和临时存储数据。在某些发行版上,此目录在启动或关闭时会被清除。