Печать печати только одной строкой

Я пытаюсь получить вывод env в переменной оболочки и распечатать его.

 #!/bin/sh ENV_BEFORE=$(env) printf $ENV_BEFORE 

В результате печатается одна переменная из env выхода.

При использовании echo вместо printf выводится весь вывод, но без новых строк.

Что мне здесь не хватает?

  • Установка позиции столбца в printf
  • Как нарисовать линию Divider с названием названия перед отображением вывода
  • Почему я получаю сообщение об ошибке «print_unicode: строка 9: printf: отсутствует символ Unicode для Unicode 0187» с этим скриптом
  • скрипт bash, выход эха в поле
  • Форматирование в формате Printf с переменным форматом - что делает эта ссылка?
  • печатать символы повторно, используя символ звездочки в bash
  • Получать вывод в форматированном виде
  • Как печатать слева и справа от уже напечатанного вывода
  • 2 Solutions collect form web for “Печать печати только одной строкой”

    Проблема в том, что вы не цитируете переменную $ENV . Как объясняется в man bash :

    Закрывающиеся символы в двойных кавычках сохраняют буквальное значение всех символов внутри кавычек, за исключением $, `, \, и, когда включено расширение истории,!. Символы $ и `сохраняют свое особое значение в двойных кавычках. Обратная косая черта сохраняет свое особое значение только тогда, когда следует один из следующих символов: $, `,", \ или .

    Итак, включение такой последовательности, как \n в двойных кавычках, сохраняет свое значение. Вот почему, когда не цитируется, \n является просто нормальным n :

     $ printf \n n$ 

    Хотя при цитировании:

     $ printf "\n" $ 

    Необязательная переменная в bash вызывает оператор split + glob. Это означает, что переменная разделяется на пробелы (или независимо от того, какая специальная переменная $IFS была установлена), и каждое результирующее слово используется в качестве глоба (оно будет расширяться, чтобы соответствовать любым совпадающим именам файлов). Ваша проблема связана с «разделенной» частью этого.

    Чтобы проиллюстрировать, давайте возьмем более простую многострочную переменную:

     $ var=$(printf "foo\nbar\n") 

    Теперь, используя функцию set -x отладки оболочки, вы можете точно увидеть, что происходит:

     $ echo $var + echo foo bar foo bar $ echo "$var" + echo 'foo bar' foo bar 

    Как вы можете видеть выше, echo $var (unquoted) подвергает $var разбиению + glob, поэтому получается две отдельные строки: foo и bar . Новая линия была съедена расколом + глобусом. Когда переменная была указана, она не была подвергнута split + glob, новая строка сохранена и, поскольку она цитируется, также интерпретируется правильно, распечатывается реклама.

    Следующая проблема заключается в том, что printf не похож на echo . Он не просто печатает все, что вы ему даете, он ожидает строку формата. Например, printf "color:%s" "green" будет печатать color:green потому что %s будет заменен green .

    Он также игнорирует любой ввод, который не может вписаться в строку формата, которую он дал. Итак, если вы запустите printf foo bar , printf будет обрабатывать foo как строку и строку формата в качестве переменной, которую он должен отформатировать. Поскольку нет %s или эквивалента, который должен быть заменен на bar , bar игнорируется, и только foo печатается:

     $ printf $var + printf foo bar foo 

    Вот что произошло, когда вы запустили printf $ENV_BEFORE . Поскольку переменная не была процитирована, split glob эффективно заменил новые строки пробелами, а printf только напечатал первое «слово», которое он увидел.

    Чтобы сделать это правильно, используйте строки форматирования и всегда указывайте свои переменные:

     printf '%s\n' "$ENV_BEFORE" 

    printf (в отличие от echo ) по умолчанию не печатает новую строку, вам нужно явно указать:

     printf "${ENV_BEFORE}\n" 

    Или лучше:

     printf '%s\n' "$ENV_BEFORE" 

    После того, как @don_crissti правильно указал в комментарии, и после того, как я снова прочитал вопрос, я думаю, что ваше дело отличается от предыдущего.

    В вашем случае проблема заключается в том, что вы не $ENV_BEFORE переменную $ENV_BEFORE .

    Вот поведение printf и echo если вы не указали переменную:

    • printf :

      1. Без цитаты и любого спецификатора формата он будет печатать только первое слово

      2. С цитатой и без какого-либо спецификатора формата он будет рассматривать что-либо в расширении, имеющем % качестве спецификатора формата, и может задушить

      3. Без цитаты и с спецификатором формата он будет подвержен расщеплению слов и расширению пути, следовательно, приведет к неожиданному результату, поскольку любое значение IFS станет пространством на выходе

      4. С помощью спецификатора цитат и формата вы получите желаемый результат, т. Е. Разложение слов и расширение пути не будут выполняться при расширении.

    • echo :

      1. Без цитаты расширение переменной будет подвержено расщеплению слов и расширению пути, поэтому вы не получите желаемый результат

      2. С quote расширение переменной не будет подвержено разбиению слов и расширению пути, и, следовательно, вы получите желаемый результат

    Interesting Posts

    Trace Linux Kernel, чтобы узнать, сколько байтов считывается с диска в операции ввода-вывода

    Должен ли ключ для автоматического запуска задания cron, который выполняется поверх ssh, не имеет ключевой фразы?

    Где должны быть установлены сценарии запуска конкретного пользователя?

    Скрипт, который распаковывает initrd, позволяет редактировать файл preseed.cfg, а пакеты его снова будут добавлены в cpio и gzip

    Как я могу узнать, открыто ли зашифрованное (LUKS) устройство?

    Обязательно ли иметь файловую систему и MMU в Linux?

    Переименовать wget загруженный родительский каталог

    Использование strace для файла C

    Терминатор не запускается в i686, проблема DBus в Python

    Как удалить пустые строки из файла в оболочке?

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

    как заменить значение на это значение + константа

    Как использовать grep и вырезать скрипт для получения URL-адресов веб-сайтов из файла HTML

    Отправляет SIGKILL в процесс с заменой, который отменит его до убийства?

    Выполнение простой математики в командной строке с использованием функций bash: $ 1, деленная на $ 2 (используя, возможно, bc)

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