단 하나의 명령에 대해 기본값과 다른 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
확인 하는 데 사용됩니다 .cmd
bash
답변2
쉘 스크립트로 래핑할 수 있습니다. umask는 모든 하위 프로세스에 상속됩니다.
cmd.sh:
umask 0022
cmd
답변3
install
또 다른 팁은 대체 항목을 사용하고 처리하여 파일을 저장하는 것입니다. 그러나 이는 명령이 데이터를 stdout으로 출력하고 단순한 파일인 경우에만 작동합니다.
install -m 600 <(cmd) newfile