Используя sed с herestring (<<<) и прочитайте -a

Я использую sed с <<< и read чтобы назначить все слова в строке переменным. Что я делаю:

 read -a A0 <<< $(sed '2q;d' /proc/stat) 

Следовательно, sed читает вторую строку файла file и немедленно завершает работу. Строка sed которую прочитала, подается в <<< которая расширяет вход, который он получает от sed и read -a присваивает результирующие значения <<< элементам массива. Является ли использование <<< и sed таким образом хорошей идеей или есть очевидные причины, которые говорят против этого и, прежде всего, есть ли более быстрый способ сделать это?

  • Изменить каталог рабочего каталога в сценарии оболочки
  • Как использовать одинарные кавычки внутри ssh и sqlplus
  • Что означает «пока:»?
  • Как вы определяете доступность файловой системы из сценария bash?
  • shell-скрипты все еще работают без #! (строка sha-bang)
  • Найдите и замените строку, если определенный шаблон найден в строке
  • Команда ведет себя по-разному при сохранении в файле * .sh
  • Как заставить команду diff игнорировать некоторые строки второго файла (bash)?
  • 2 Solutions collect form web for “Используя sed с herestring (<<<) и прочитайте -a”

    Вы можете напрямую использовать назначение массива:

     A0=($(sed '2q;d' /proc/stat)) 

    Помните, что это выполняет globbing: если вывод команды содержит групповые символы оболочки, то слова, содержащие подстановочные знаки, заменяются списком соответствующих файлов, если они есть. Если на выходе команды может содержаться один из символов \[?* , Временно отключить глобус:

     set -f A0=($(sed '2q;d' /proc/stat)) set +f 

    Это может быть крошечным быстрее, чем использование:

     $ time for i in {1..1000}; do read -a A0 <<< $(sed '2q;d' /proc/stat); done real 0m2.829s user 0m0.220s sys 0m0.480s $ time for i in {1..1000}; do A0=($(sed '2q;d' /proc/stat)); done real 0m2.388s user 0m0.128s sys 0m0.276s 

    С bash 4.0 и выше вы можете использовать mapfile :

     mapfile -t < <(sed '2q;d' /proc/stat) 

    Но mapfile кажется самым медленным:

     $ time for i in {1..1000}; do mapfile -t < <(sed '2q;d' /proc/stat); done real 0m3.990s user 0m0.104s sys 0m0.444s 

    Синтаксис кажется слишком сложным для моих глаз. Вместо этого я использовал бы следующее:

     read -a A0 < <( sed '2q;d' /proc/stat ) 

    Обычно я использую синтаксис <<< word когда мне нужна команда для ввода ввода из переменной, а не из другой команды.

    Interesting Posts

    Как добавить пользователей не интерактивно?

    GNU Make не игнорирует неудачную команду

    Обновлено Fedora 23 не загружается в графический логин – только вызывает текстовый терминал

    Как bzip файл с минимальным процентом процессора?

    rsync и смотреть частично переданный видеофайл

    Make: рецепт для целевого 'pcap-bt-monitor-linux.o' не выполнен

    Как получить статус выхода определенной команды в конвейере?

    Поддерживать ли терминал в верхней части терминала?

    Unix awk, функция флага, многократное условие if

    Где найти журналы служб, запущенных systemd при загрузке компьютера?

    Ubuntu Как изменить тактовую частоту с терминала?

    Начать глобус с шаблоном исключения

    структура каталогов против файловой системы

    Как использовать экран блокировки рабочего стола и отключить экран входа в систему XScreenSaver?

    безопасно / не опасно для ssh с ключами через открытый прозрачный прокси?

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