众多具有( ) 选项的 *nix 命令 ( mkdir
、mkfifo
、mknod
)是否有任何技术优点/必要性?-m
--mode
我之所以问这个问题,是因为据我所知,umask
(shell 命令和系统调用)提供了控制系统权限所需的一切:
例如,我可以这样做:
mkdir -m 700 "$my_dir"
..但我可以轻松地做到:
old_umask=`umask` \
&& umask 0077 \
&& mkdir "$my_dir"
umask "$old_umask"
需要明确的是,我可以看到前者更加用户友好和方便(特别是对于命令行使用),但我真的没有看到技术的前者相对后者的优势。
另请注意,我了解这种灵活性在底层系统调用级别的优点:如果我想调用open
或sem_open
或您拥有最多 600 个权限,那么我只需传递S_IRUSR | S_IWUSR
给开放系统调用,而不必理会系统umask
调用,这是有道理的,保存一次系统调用往返(或两次,如果我想重置 umask,因为调用umask
修改了当前的 umask),并且我的代码更简单/更干净。这不适用于命令行示例,因为此类命令的-m
/选项将--mode
有无论如何,调用umask
将该命令进程的 umask 清零,以确保它应该在新文件/任何内容上设置的模式/权限位。 (例如,如果我的 shell 的 umask 是022
,那么mkdir -m 777 /tmp/foo
只有在它首先umask
在内部调用以将其从 shell 继承的 umask 归零时才能按预期工作。)
所以我想确保我在考虑问题时没有错过的是,是否有一些事情是您无法仅使用命令umask
而不依赖mk* 命令的-m
/选项来完成的?--mode
答案1
有些事情是你umask
一个人无法完成的:
创建一个具有上述权限的常规文件
0666
。创建具有上述权限的目录
0777
。
所以你确实需要chmod
或--mode
也。如果出于安全原因,您绝不想要创建一个具有比预期更高的权限的对象,chmod
没有umask
也不够。在某些极端情况下,您甚至必须使用两者,从而导致相当丑陋的序列umask
// mkdir
/ chmod
。umask
(示例:创建组临时目录 ( 01770
)。)
so可以用and--mode
代替,但不能只用其中之一。chmod
umask