Zsh

如何僅更改一個命令的 umask?

  • February 27, 2022

如何在 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.

引用自:https://unix.stackexchange.com/questions/65885