Subshells, permissions and following symlinks on OS X/Darwin: why do I get permission errors?

StackOverflow https://stackoverflow.com/questions/18180682

  •  24-06-2022
  •  | 
  •  

Question

(Edit: There was a typo that caused the problem. Please see comments on existing answers)

I wanted to stat a file that symlinked to another file and thought that I could use subshells and readlink command substitution to do the job. For context, let me mention that this is on OS X 10.8.3 (Darwin).

But I ran into a permission denied error.

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)

I checked the output of the readlink command and sure enough, I didn't see anything wrong with it.

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

stating the file directly raised no error and produced the output I needed.

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

What's causing the permission denied in one case but not the other?

Was it helpful?

Solution

This:

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

means "open a subshell, cd to /usr/share/locale, run the command en_US/LC_COLLATE, and run stat on the output".

But I think the command you want to run is readlink en_US/LC_COLLATE, not en_US/LC_COLLATE; so:

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

(I'm guessing this was just a typo?)

OTHER TIPS

$(en_US/LC_COLLATE)

will execute string en_US/LC_COLLATE as command (script).

Since it does not have execute permission shell will output that error.

Probably you wanted to do it that way:

$(cd /usr/share/locale/; stat en_US/LC_COLLATE)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top