OS X / Darwin上的子shell,权限和后续符号链接:为什么我会收到权限错误?

时间:2013-08-12 06:22:55

标签: bash shell darwin

(编辑:导致问题的拼写错误。请参阅现有答案的评论)

我想stat一个符号链接到另一个文件的文件,并认为我可以使用子shell和readlink命令替换来完成这项工作。对于上下文,我要提一下,这是在OS X 10.8.3(达尔文)上。

但我遇到了一个拒绝许可的错误。

ujagtahb@ujags-Retina-MBP-5.local:~/Code_Pen/c_exp$(cd /usr/share/locale/; stat $(en_US/LC_COLLATE))
bash: en_US/LC_COLLATE: Permission denied
727393128 1449 crw--w---- 1 ujagtahb tty 268435496 0 "Aug 12 11:36:50 2013" "Aug 12 11:36:51 2013" "Aug 12 11:36:51 2013" "Aug 12 11:36:51 2013" 131072 0 0 (stdin)

我检查了readlink命令的输出,果然,我没有看到任何错误。

ujagtahb@ujags-Retina-MBP-5.local:~/Code_Pen/c_exp$readlink /usr/share/locale/en_US/LC_COLLATE
../la_LN.US-ASCII/LC_COLLATE

stat文件直接引发了没有错误并产生了我需要的输出。

ujagtahb@ujags-Retina-MBP-5.local:~/Code_Pen/c_exp$stat /usr/share/locale/la_LN.US-ASCII/LC_COLLATE
16777218 284538 -r--r--r-- 1 root wheel 0 2086 "Aug 12 11:36:51 2013" "Jul 22 07:55:02 2012" "Jul 22 07:55:02 2012" "Jun 21 01:35:25 2012" 4096 0 0x20 /usr/share/locale/la_LN.US-ASCII/LC_COLLATE

在一个案例中导致许可被拒绝的原因是什么?

2 个答案:

答案 0 :(得分:1)

$(en_US/LC_COLLATE)

将执行字符串en_US/LC_COLLATE作为命令(脚本)。

由于它没有执行权限,shell将输出该错误。

可能你想这样做:

$(cd /usr/share/locale/; stat en_US/LC_COLLATE)

答案 1 :(得分:1)

此:

(cd /usr/share/locale/; stat $(en_US/LC_COLLATE))

表示“打开子shell,cd/usr/share/locale运行命令en_US/LC_COLLATE ,然后在输出上运行stat。< / p>

但我认为您要运行的命令是readlink en_US/LC_COLLATE,而不是en_US/LC_COLLATE;这样:

(cd /usr/share/locale/; stat $(readlink en_US/LC_COLLATE))

(我猜这只是一个错字?)