Причина, совершенно отличная от уже приведенных в других ответах: одна из причин, по которой этот метод иногда используется, когда единственный оператор определения функции на верхнем уровне - это вызов main
, заключается в том, чтобы убедиться, что сценарий случайно не сделает что-нибудь неприятное, если сценарий усечен. Сценарий может быть усечен, если он передан из процесса A в процесс B (оболочка), а процесс A завершается по какой-либо причине до того, как он завершит запись всего сценария. Это особенно вероятно, если процесс A извлекает сценарий с удаленного ресурса. Хотя по соображениям безопасности это не очень хорошая идея, это то, что нужно сделать, и некоторые сценарии были изменены, чтобы предвидеть проблему.
Пример с dd
:
$ cat data
insertion goes here: <...>
$ cat insert
ABC 123 XYZ
$ dd if=insert skip=4 count=3 of=data seek=22 bs=1 conv=notrunc
3+0 records in
3+0 records out
3 bytes transferred in 0.001 secs (2918 bytes/sec)
$ cat data
insertion goes here: <123>
Команда dd
, которую я использовал здесь, пропускает 4 блока во входной файл, а затем читает 3 блока. Блоки записываются в выходной файл после поиска в нем 22 блоков. Вывод не усекается. Один блок - это один байт.
Это работает для меня:
$ echo aaaaaaaaaa > a
$ echo bbbbbbbbbb > b
$ dd if=a of=b conv=notrunc ibs=1 obs=1 seek=3 count=4
$ cat b
bbbaaaabbb