1つのコマンドのumaskを変更するには?

1つのコマンドのumaskを変更するには?

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サポートされていない後者を呼び出します%Tbash拡張子はksh93'sに触発されました)。特定のバージョンに組み込まれていることをtype cmd確認するために使用されます。cmdbash

おすすめ記事