root
может делать что угодно, и для него не выполняются проверки разрешений.
Читайте также о setuid .
Поскольку программа -даже head
или оболочка, даже при запуске root
(, чей uid равен 0 по определению )-, использует системные вызовы (, перечисленные в системные вызовы (2)...)
См. также путь _разрешение (7)и возможности (7)и учетные данные (7). Вместе они объясняют, что когда open (2)-выполняется процесс , работающий /usr/bin/head
-, завершается ошибкой. Кстати, чтение (2)не проверяет разрешения.
Обратите внимание, что выполнение некоторых исполняемых файлов выполняется с помощью execve (2 ), который документирует, когда он может дать сбой. Ваша оболочка выполняет множество вызовов fork (2)и execve
.
В хорошей книге по программированию для Unix, такой как старая ALP , есть несколько глав, объясняющих все это. Ваша оболочка — это просто еще одна программа (прочтите также философию Unix)и вы можете написать оболочку на C (или изучить исходный код существующих программ-оболочек свободного программного обеспечения, например из GNU bash).
Используйте переключатель -a
, чтобы разделить каждую строку на массив @F по пробелам.
perl -lane 'print join "\t", @F[0, 1], $_ for split /,/, $F[2]'