Есть ли разница между read, head -1 и sed 1q?

Следующие команды кажутся примерно эквивалентными:

read varname varname=$(head -1) varname=$(sed 1q) 

Одно отличие состоит в том, что read – это встроенная оболочка, а head и sed – нет.

Кроме того, есть ли разница в поведении между тремя?

Моя мотивация заключается в том, чтобы лучше понять нюансы оболочки и ключевых утилит, таких как head,sed . Например, если использование head является легкой заменой для read , то почему read существует как встроенное?

4 Solutions collect form web for “Есть ли разница между read, head -1 и sed 1q?”

Ни эффективность, ни встроенность не являются самой большой разницей. Все они будут возвращать разные выходные данные для определенного ввода.

  • head -n1 предоставит head -n1 только в том случае, если на входе есть один.

  • sed 1q всегда будет обеспечивать конечную новую строку, но в остальном сохранить вход.

  • read никогда не будет предоставлять завершающую новую строку и будет интерпретировать последовательности обратной косой черты.

Кроме того, read имеет дополнительные параметры, такие как расщепление, тайм-ауты и история ввода, некоторые из которых являются стандартными, а другие – разными.

Во-первых, вы можете разобрать текст с помощью чтения, а не просто взять целую строку

 echo "foo:bar:baz" | { IFS=: read one two three echo $two } 

Встроенные функции присутствуют в качестве способа ускорения системных вызовов. Итак, я считаю, что команда read присутствует как встроенная, чтобы быть более эффективной.

Цитируя отсюда ,

Эти встроенные команды являются частью оболочки и реализованы как часть исходного кода оболочки. Оболочка распознает, что команда, которую она попросила выполнить, была одним из ее встроенных, и сама выполняет это действие, не вызывая отдельного исполняемого файла. Различные оболочки имеют разные встроенные функции, хотя в базовом наборе будет много перекрытий.

Теперь я бы хотел, чтобы это было экспериментально проведено самостоятельно, чтобы вы могли понять, почему read присутствует как встроенная оболочка.

Обычно вы не можете делать strace на встроенных оболочках. Однако для этого есть обходной путь. Это объясняется довольно аккуратно в этом ответе .

  1. В первой оболочке запустите команду как stty -echo .
  2. Откройте другую оболочку и запустите команду как cat | strace bash > /dev/null cat | strace bash > /dev/null .
  3. Теперь оболочка будет ждать ввода пользователем команд, а там, когда пользователь вводит команды, вы можете видеть, что происходит и на системном уровне.
  4. Когда вы даете вышеуказанные 3 команды, вы можете видеть, что чтение имеет меньше системных вызовов, чем остальные 2 команды. Я не вставляю вывод из strace поскольку он довольно большой.

Вы можете использовать read varname только внутри сценария оболочки, но другие два, которые вы можете использовать, не создавая сценарий оболочки.

Например:

Вы можете использовать varname=$(head -1) и varname=$(sed 1q) просто как команду в терминале, но вы также должны указать свой аргумент, т. Е. Какие файлы имеют самую верхнюю строку, например varnam=$(head -1 file1) .

  • Поиск писателя файла
  • Как использовать multiline как group-separator в grep?
  • Обработка путей в файле m3u
  • Проверьте связанные имена файлов и удалите один из них
  • Почему «читай» не забирает все мои вары?
  • Выполнять поиск по двум спискам
  • Завершение скрипта оболочки bash, работающего в фоновом режиме
  • Как создать загрузочную флешку для «efi-shell»
  • Вывод команды readlink
  • Выполнение сценария оболочки на нескольких серверах
  • Передача именованных аргументов в виде массива в сценарии оболочки
  • Linux и Unix - лучшая ОС в мире.