В вашем примере
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
- количество байтов для перейти к файлу.
Запуск текущей оболочки под strace (1)
, а затем выполнение, например, <(команда)
дает:
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fa6713d59d0) = 13305
С чисто дефиниционной точки зрения, поскольку clone (2) определяется как
создать дочерний процесс
и подоболочка как
Запуск сценария оболочки запускает новый процесс, подоболочку.
можно сказать, что да - подстановка запущенного процесса вызывается как подоболочка.