Расширение списка через запятую во вкладке -файл с разделителями на отдельные строки

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).

3
13.04.2021, 18:48
2 ответа

Используйте переключатель -a, чтобы разделить каждую строку на массив @F по пробелам.

perl -lane 'print join "\t", @F[0, 1], $_ for split /,/, $F[2]'
3
28.04.2021, 22:52

Другим вариантом здесь является nest --explodeдействие Миллера

mlr --nidx --fs tab nest --explode --values --across-records --nested-fs ',' -f 3 file

или используя сокращенный спецификатор nest

mlr --nidx --fs tab nest --evar ',' -f 3 file
1
28.04.2021, 22:52

Теги

Похожие вопросы