在Zsh中,以下操作失败:
$ echo hi > /tmp/this/path/does/not/exist/out.txt
zsh: no such file or directory: /tmp/this/path/does/not/exist/out.txt显然,问题在于>不能创建缺少的父目录。我觉得这种行为很烦人,它应该只会造成脏。我怎样才能做到这一点?
对于cp和mkdir这样的选项,只需对--parents选项进行别名就可以了。但是,>不能别名,因为它不是命令。我能做什么?
理想情况下,我希望在zsh中实现这一点,但我将接受“使用不同的shell”作为答案。
发布于 2022-01-30 20:31:42
您可以始终创建一个:
create() { mkdir -p -- $1:h && cat > $1; }和使用:
echo something | create path/to/some/file甚至:
create() {
local dest
for dest do
mkdir -p -- $dest:h || return
done
cat > "$@"
}为了能够做到:
echo hi | create some/file some/other/file另一种方法:
makeparents() {
mkdir -p -- $1:h
print -r -- $1
}和:
echo hi > "$(makeparents path/to/some/file)"(对于以换行符结尾的文件名不起作用)
您还可以使用zsh的动态命名目录扩展来完成它:
redir-parent() {
[[ $1 = n ]] && [[ $2 = p:* ]] || return
local file=${2#p:}
mkdir -p -- $file:h
reply=($file)
}
zsh_directory_name_functions+=(redir-parent)然后:
echo something > ~[p:path/to/some/file]其中path/to/some将作为扩展的一部分创建。
无论如何,在所有这些情况下,当创建路径目录组件时,它们将具有受当前umask影响的默认权限。
在cmd | create path/to/file版本中,即使无法创建/path/to或无法打开path/to/file (并且可能会被SIGPIPE杀死),也会运行D11。
在其他情况下,失败的重定向将取消cmd的运行。他们还拥有保留cmdS退出地位的优势。
如果不能创建所有目录组件,或者不能打开文件进行写入,则即使重定向本身失败,也可能会创建某些目录。然后,您可能需要进行一些手动清理。
https://unix.stackexchange.com/questions/688525
复制相似问题