Zsh
如何僅更改一個命令的 umask?
如何在 Linux 中使用與預設值不同的 umask 以互動方式執行命令(zsh,如果重要的話),僅用於一個命令?也許命令組合在一行中?新的 umask 應僅適用於該命令,並為輸入的下一個命令返回其預設值。
理想情況下,該命令與輸入之前有效的預設 umask 無關(換句話說,不必指定預設 umask)。
啟動一個子shell:
(umask 22 && cmd)
那麼新的
umask
只會改變那個子shell。注意,
zsh
在子shell程序中執行子shell的最後一個命令,而不是fork另一個命令,這意味著如果該命令是外部的,你甚至不會浪費一個程序,只是fork更早完成(所以umask
完成了在稍後將執行您的命令的子程序中)。在諸如
bash
沒有進行優化的 shell 中,您可以使用exec
顯式請求不生成子程序。比較:$ zsh -c '(umask 22 && ps -H); exit' PID TTY TIME CMD 3806 pts/0 00:00:00 zsh 3868 pts/0 00:00:00 zsh 3869 pts/0 00:00:00 ps
$ bash -c '(umask 22 && ps -H); exit' PID TTY TIME CMD 3806 pts/0 00:00:00 zsh 3870 pts/0 00:00:00 bash 3871 pts/0 00:00:00 bash 3872 pts/0 00:00:00 ps $ bash -c '(umask 22 && exec ps -H); exit' PID TTY TIME CMD 3806 pts/0 00:00:00 zsh 3884 pts/0 00:00:00 bash 3885 pts/0 00:00:00 ps
在 bash 中,與 zsh 不同,不要使用內置
exec
函式或函式,因為這不會執行內置 / 函式,而是嘗試使用該名稱執行外部命令。$ bash -c '(printf "%(%F)T\n" -1)' 2022-02-27 $ bash -c '(exec printf "%(%F)T\n" -1)' printf: %(: invalid conversion specification
後者稱為
/usr/bin/printf
不支持%T
(受’sbash
啟發的副檔名)。ksh93
用於type cmd
檢查cmd
您的特定版本中是否內置了bash
.