Вызывается ли команда в подстановке процесса в подоболочке?

В вашем примере

001
002
003
004

байт номер 8 является вторым символом новой строки, а не 0 в следующей строке.

Следующее даст вам количество полных строк после $ b байтов:

$ dd if=data.in bs=1 count="$b" | wc -l

Он сообщит 2 с b , установленным на 8, и это сообщит 1 с b , установленным на 7.

Утилита dd , как она здесь используется, будет читать данные из файла . в , и будет читать блоки $ b размером 1 байт.

Как правильно указывает icarus в комментариях ниже, использование bs = 1 неэффективно. В данном конкретном случае более эффективно поменять местами bs и count :

$ dd if=data.in bs="$b" count=1 | wc -l

Это будет иметь тот же эффект, что и первая команда dd , но будет читать только один блок из $ b байт.

Утилита wc считает новые строки, а «строка» в Unix всегда заканчивается новой строкой. Таким образом, указанная выше команда по-прежнему будет говорить 2 , если вы установите для b значение меньше 12 (следующая новая строка). Таким образом, результат, который вы ищете, - это любое число, указанное в вышеуказанных отчетах конвейера, плюс 1.

Это, очевидно, также будет учитывать случайные символы новой строки в двоичной части вашего файла, которая предшествует тексту ASCII. Если бы вы знали, где начинается бит ASCII, вы могли бы добавить skip = "$ offset" к команде dd , где $ offset - количество байтов для перейти к файлу.

1
18.12.2016, 09:16
1 ответ

Запуск текущей оболочки под strace (1) , а затем выполнение, например, <(команда) дает:

clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fa6713d59d0) = 13305

С чисто дефиниционной точки зрения, поскольку clone (2) определяется как

создать дочерний процесс

и подоболочка как

Запуск сценария оболочки запускает новый процесс, подоболочку.

можно сказать, что да - подстановка запущенного процесса вызывается как подоболочка.

3
27.01.2020, 23:25

Теги

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