我之前已经注意到这一点,但在我回答“如何将目录移动到同名目录中? ”时它又被提出来了:
的mktemp在MacOS实用程序不表现一样在Linux或BSD(或至少OpenBSD的)的同名的相对于所述公用事业TMPDIR环境变量。
在当前目录下创建一个临时文件,我通常可以说
tmdfile=$(TMPDIR=. mktemp)
Run Code Online (Sandbox Code Playgroud)
或者
tmpfile=$(TMPDIR=$PWD mktemp)
Run Code Online (Sandbox Code Playgroud)
(对于带有 的临时目录也类似mktemp -d)。
在 macOS 上,我必须通过给它一个实际模板来强制该实用程序使用当前目录,如
tmpfile=(mktemp ./tmp.XXXXXXXX)
Run Code Online (Sandbox Code Playgroud)
因为使用更方便的tmpfile=$(TMPDIR=. mktemp)将忽略该TMPDIR变量并/var/folders/qg/s5jp5ffx2p1fxv0hy2l_p3hm0000gn/T在类似命名的目录下或中创建文件。
mktempmacOS 上的手册提到
如果
-t prefix给出该选项,mktemp将根据前缀和_CS_DARWIN_USER_TEMP_DIR配置变量(如果可用)生成模板字符串。如果_CS_DARWIN_USER_TEMP_DIR不可用,回退位置 是TMPDIR和/tmp。
在我的系统上,_CS_DARWIN_USER_TEMP_DIR似乎未设置:
$ getconf _CS_DARWIN_USER_TEMP_DIR
getconf: no such configuration parameter `_CS_DARWIN_USER_TEMP_DIR'
Run Code Online (Sandbox Code Playgroud)
但是例如
tmpfile=$(TMPDIR=. mktemp -t hello)
Run Code Online (Sandbox Code Playgroud)
仍然在下创建一个文件/var/folders/.../(也在使用$PWD代替 时.)。
我注意到
$ getconf …Run Code Online (Sandbox Code Playgroud) 在 vim 中似乎可以这样做:
:s/^\t\+/\=repeat(' ',len(submatch(0)))
Run Code Online (Sandbox Code Playgroud)
我不知道这如何翻译成 sed 。我尝试了以下操作:
sed -ri "s/^\t\+/\=repeat(' ',len(submatch(0)))/g" test.txt
Run Code Online (Sandbox Code Playgroud)
该命令似乎没有效果。