为什么OS X上的mktemp被一个可以在Linux上运行的命令破坏了?

use*_*780 5 linux macos shell

在Linux中,这个shell脚本可以工作:

# Temporary directory for me to work in
myTEMP_DIR="$(mktemp -t -d zombie.XXXXXXXXX)"

# Change to temporary directory
cd "${myTEMP_DIR}"
Run Code Online (Sandbox Code Playgroud)

但是,当我在我的Mac上执行此操作时,我收到以下错误:

dhcp-18-189-66-216:shell-scripting-sci-day2 myname$ myTEMP_DIR="$(mktemp -t -d zombie.XXXXXXXXX)"
dhcp-18-189-66-216:shell-scripting-sci-day2 myname$ cd "${myTEMP_DIR}"
-bash: cd: /var/folders/d8/b8d1j9x94l9fr3y21xrnc0640000gn/T/-d.QZDPA9Da
zombie.nwlEnHGDb: No such file or directory
Run Code Online (Sandbox Code Playgroud)

谁知道什么是错的?谢谢.

ric*_*ici 17

在Mac OS X上,获取参数的-t选项,mktemp该参数是临时文件/目录名称的前缀.在Linux上,-t参数只是表明前缀应该是$TMPDIR默认值或某些默认值/tmp.

因此,在Mac OS X,调用mktemp -t -d zombie.XXXXXXXXX,表示-t有一种说法是-d; 因此,mktemp创建一个名称以-dinside $TMPDIR(/var/folders/d8/b8d1j9x94l9fr3y21xrnc0640000gn/T/-d.QZDPA9Da)开头的文件.然后,template参数用于创建另一个文件(zombie.nwlEnHGDb在当前工作目录中).最后,它将两个名称打印到stdout,在那里它们成为变量的值${myTEMP_DIR}(完成换行符分隔符).因此,cd失败了.

对于与平台无关的调用,请避免使用-t标记并使用显式模板:

mktemp -d "${TMPDIR:-/tmp}/zombie.XXXXXXXXX"
Run Code Online (Sandbox Code Playgroud)

  • macos 和 Linux 的额外区别:macos `mktemp` 命令只允许模板“X”作为后缀;而 Linux 允许在任何地方使用“X”。例如,在 macos 上: `mktmp /tmp/XXXXXX.tempfile` --> 创建一个名为 `/tmp/XXXXXX.tempfile` 的文件;在 Linux 上,这将创建一个文件`/tmp/B12nKS.tempfile`(即 X 被随机字符替换)。在 Ubuntu 14.04 和 macos Sierra 上测试。 (2认同)