단 하나의 명령에 대한 umask를 변경하는 방법은 무엇입니까?

단 하나의 명령에 대한 umask를 변경하는 방법은 무엇입니까?

단 하나의 명령에 대해 기본값과 다른 umask를 사용하여 Linux(중요한 경우 zsh)에서 명령을 대화식으로 실행하는 방법은 무엇입니까? 명령 조합을 한 줄로 결합할 수 있을까요? 새 umask는 해당 명령에만 적용되어야 하며 입력된 다음 명령에 대해 기본값을 반환해야 합니다.

이상적으로 이 명령은 입력되기 전에 적용되었던 기본 umask와 독립적입니다(즉, 기본 umask를 지정할 필요가 없습니다).

답변1

시작하다서브쉘:

(umask 22 && cmd)

그러면 new는 umask서브쉘만 변경합니다.

서브셸의 마지막 명령 은 zsh다른 명령을 포크하는 것이 아니라 서브셸 프로세스 내에서 실행됩니다. 즉, 명령이 외부인 경우 프로세스를 낭비하지 않고 포크가 더 일찍 완료됩니다(따라서 umask완료는 다음 이후에 완료됩니다 ). 명령은 나중에 하위 프로세스에서 실행됩니다.

bash이 최적화가 아직 수행되지 않은 셸에서는 다음을 사용하여 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

zsh와 달리 bash에서는 다음을 수행하십시오.아니요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( bash확장자는 ksh93's에서 영감을 얻었습니다). 특정 버전에 내장되어 있는지 type cmd확인 하는 데 사용됩니다 .cmdbash

답변2

쉘 스크립트로 래핑할 수 있습니다. umask는 모든 하위 프로세스에 상속됩니다.

cmd.sh:

umask 0022
cmd

답변3

install또 다른 팁은 대체 항목을 사용하고 처리하여 파일을 저장하는 것입니다. 그러나 이는 명령이 데이터를 stdout으로 출력하고 단순한 파일인 경우에만 작동합니다.

install -m 600 <(cmd) newfile

관련 정보