1つのコマンドに対してデフォルトとは異なるumaskを使用してLinux(重要な場合はzsh)でコマンドを対話的に実行するには?コマンドの組み合わせを1行にまとめることができますか?新しい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