Есть ли разница между 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) .

  • Как перенести файл на основе выражения имени файла с помощью сценария оболочки?
  • Как я могу запустить команду cron с существующими переменными окружающей среды?
  • Почему grep обрабатывает строку ebug 'по-разному?
  • Как найти и заменить только определенное слово (которое находится в конце файла) с помощью команды оболочки?
  • «Слишком много аргументов в [(тестовом) заявлении»
  • Извлечение информации о трассировке с помощью gawk
  • Что означает $ # в оболочке?
  • Объединение зависимостей со сценариями оболочки
  • Возможно ли выполнить некоторые команды в подоболочке, не выходя сразу после этого?
  • использование </ dev / null & в командной строке
  • Использование tar с поиском
  • Interesting Posts

    Как обеспечить, чтобы пользователи не могли войти в систему, кроме FTP?

    Есть ли команда, запрещающая IP-адрес

    xrandr не показывает порт hdmi и vga, внешний монитор не отображается

    Объединение альтернативных строк из двух файлов

    Строка Keep, содержащая X в первых двух полях

    В OSX ssh-keygen создает ключ, но сеанс не будет подключаться

    Dwm-pertag patch – сохранение состояния между перезапусками

    Делайте более длинные строки из подстрок, сохраняя новую строку между каждой строкой

    cp или mv-файлы в тот же каталог, в котором они уже находятся, когда я нахожусь в другом?

    Каков безопасный формат жесткого диска для архивирования данных в хранилище данных?

    добавьте apt-репозиторий только для нескольких пакетов (или зеркалируйте их)

    Startscript: использование $! создать pidfile – иногда возвращать неправильный pid (выключен одним)

    Перекрестные ссылки по всем файлам

    Является ли ловушка унаследована подоболочкой?

    Bash, вставить последний использованный аргумент текущей команды

    Linux и Unix - лучшая ОС в мире.