【问题标题】:What happened to the TMP environment variable?TMP 环境变量发生了什么变化?
【发布时间】:2011-01-26 23:07:04
【问题描述】:

我一直听说在 UNIX 机器上找到临时文件夹的正确方法是查看 TMP 环境变量。在编写适用于 Windows 和 Linux 的代码时,我会检查 TEMP 和 TMP。

今天,我发现我的 Ubuntu 安装根本没有那个环境变量。

我知道您似乎总是可以依靠 /tmp 将您的临时文件放入其中,但我知道 TMP 是用户可以告诉您将临时文件放入其他地方的方式。

还是这样吗?

【问题讨论】:

  • 这怎么太本地化了?我敢肯定不止几个人在 Linux 中使用临时文件。

标签: bash tmp


【解决方案1】:

POSIX/FHS 表示 /tmp 是临时文件的根,尽管有些程序可能会选择检查 $TEMP$TMP

【讨论】:

    【解决方案2】:

    创建临时目录的好方法是使用 mktemp,例如

    mktemp -d -t
    

    这样,您甚至可以确保您的文件名不会与现有文件冲突。

    【讨论】:

    • 这是一个很好的答案,但它不是上述问题的答案。
    • mktemp Honors TMPDIR 所以这比通过 itsefl 使用变量要好
    【解决方案3】:

    你可能在想TMPDIR

    此变量应代表一个目录的路径名,该目录的路径名可用于需要一个位置来创建临时文件的程序。

    【讨论】:

    • 我的 Ubuntu LTS Server 12.04 和 14.04 的默认安装没有任何关于临时目录的环境变量,既没有 TMPDIR,也没有 TMP 或 TEMP,即使在某些地方记录了 TMPDIR。最后,这个变量似乎不再可靠了。
    • 有一个后备:TMPDIR="{${TMPDIR:-$(dirname $(mktemp))/}"
    【解决方案4】:
    全局变量命令。 [ 有用 ]
    # Let's look at environment variable's
    printenv | sort
    # search for TMP var
    printenv | grep TMP
    
    $TMP 未声明,因为它是 $TMPDIR [ Answer ]
    ## [ -d /tmp ] && echo 'is true' 
    export TMP='/tmp' # In order to pass variables to a subshell.
    

    使用 $TMPDIR ,这是 Linux 的正确 var 名称。 注意:/tmp 目录内容(文件)将在关机/重启时被删除,这应该是预期的/期望的。

    【讨论】:

      【解决方案5】:

      与@Chris Lercher 所说的类似,我发现这对我有用:

      dirname $(mktemp -u -t tmp.XXXXXXXXXX)
      

      这实际上不会创建临时文件(因为 mktemp 的 -u 标志),但它会为您提供临时文件将被写入的目录。这个 sn-p 适用于 OSX 和 Ubuntu(也可能是其他 *nix)。

      如果要将其设置为变量,请执行以下操作:

      TMPDIR=`dirname $(mktemp -u -t tmp.XXXXXXXXXX)`
      

      【讨论】:

      • 或者简单地说:dirname $(mktemp -u)
      【解决方案6】:

      仅供参考 - ubuntu(我假设其他基于 systemd 的发行版)确实定义了 XDG_RUNTIME_DIR 变量 - 这是一个每个用户的临时空间,所以比 /tmp 更安全:

      $ echo $XDG_RUNTIME_DIR
      
      /run/user/1000
      $ ls -ld $XDG_RUNTIME_DIR
      
      drwx------ 2 ubuntu ubuntu 40 Dec 22 15:18 /run/user/1000
      

      我认为 XDG_RUNTIME_DIR 是由 systemd/pam 维护的,所以它 不会在 Docker 或其他非系统环境中设置。

      如果你愿意,你可以在~/.bashrc 中做这样的事情:

      export TEMP="${XDG_RUNTIME_DIR:-/tmp}"
      

      见: https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html https://www.freedesktop.org/wiki/

      另外 - 在我看来,XDG_RUNTIME_DIR 和 sudo 有一些注意事项: https://unix.stackexchange.com/questions/346841/why-does-sudo-i-not-set-xdg-runtime-dir-for-the-target-user

      【讨论】:

        猜你喜欢
        • 2016-01-27
        • 2012-06-03
        • 1970-01-01
        • 1970-01-01
        • 2012-11-23
        • 2016-10-18
        • 2013-05-16
        • 1970-01-01
        • 2021-07-09
        相关资源
        最近更新 更多