Answers:
只需使用实用程序的- w
标志test
:
[ -w /path/to/file ] && echo "writeable" || echo "write permission denied"
请注意,如果稍后要写入文件,则仍然有可能无法写入文件。该文件可能已移动,权限可能已更改,等等。它也可能会-w
检测到写权限,但由于其他一些因素而使文件不可写。
man test
orman [
type -a
test
使用euidaccess
仅检查权限位。是否没有其他可能禁止写访问的因素(例如SELinux)?
&&
并且||
具有相同的优先级。他们从左到右进行评估。
另一种方法:
if >> /path/to/file
then
echo "writeable"
else
echo "write permission denied"
fi
这将尝试打开文件进行追加,如果成功, 则不运行命令(即,运行null命令),并输出到文件。
请注意,这将创建一个空文件(如果不存在)。
该命令的-w
运算符test
可能只是执行a stat
,然后尝试找出它是否应该具有访问权限。test
在某些特殊情况下,我的选择(上面)比该方法更可靠,因为它强制访问检查由内核而不是外壳完成。例如,
stat
可能会导致模式值误导。touch
一个我拥有但没有写权限的文件,所以成功了。我想这chmod
是文件,然后chmod
又返回。因此touch
,对于该问题的答案似乎绝对没有用。
vim
当强制在只读文件上写入时,IIRC 具有快速更改权限的行为。我检查strace
,touch
的open
失败EACCES
,但后续调用utimensat
成功,这就是为什么我认为touch
对整个出口成功。
utimensat(2)
说:“ 权限要求: 1.写入访问权限(或)2.调用者的有效用户ID必须与文件的所有者匹配,…。”
>> file
不可移植(例如,在zsh中运行NULLCMD),请true >> file
改用。而且,如果该文件是命名管道,则它会带来讨厌的副作用。
G人是对的:[ -w ]
不会总是说实话。这里是为了处理外壳中不存在的文件和“ 权限被拒绝”消息:
( [ -e /path/to/file ] && >> /path/to/file ) 2> /dev/null &&
echo writable ||
echo not writable
更新:看起来很恐怖,不是吗?好吧,是的。嗯...如何措辞...请勿使用此功能,除非您完全知道自己处于要求它按预期工作的条件下。请参阅Stephane的评论。
那么得出什么结论呢?即使[ -w ]
不说实话,它也是旨在完成这项工作的一个命令。如果不行,那么我们会怪罪它,编写错误报告,并且它将在将来运行。更好地检查其工作和使用条件[ -w ]
;为特殊情况编写特殊代码。解决方法有其自身条件。
[ -w /path/to/file ]
是最好的先验。
test -w
在大多数实现中,使用它access(2)
应该足以测试权限。