Куда запаздывающий символ новой строки пошел от моей замены команды?

Если Вы устанавливаете yum-utils, это даст Вам yum-debug-dump который запишет те переменные и больше информации об отладке в файл. Нет никакой опции записать в stdout, он будет всегда писать в некоторый файл, который действительно не настолько полезен.

Это - очевидно, не отличное решение, таким образом, вот острота Python, которую можно скопировать и вставить, который распечатает те переменные к stdout.

python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'

Это работает над CentOS 5 и 6, но не 4. конфетка записана в Python, таким образом, вкусный модуль Python уже находится на Вашем сервере, никакая потребность установить что-либо exra.

Вот то, на что это похоже на CentOS 5:

[root@somebox]# python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'
{'arch': 'ia32e',
 'basearch': 'x86_64',
 'releasever': '5',
 'yum0': '200',
 'yum5': 'foo'}
[root@somebox]# 
15
01.08.2011, 01:10
2 ответа

Функция замены команды $() (и его кузен обратная галочка), конкретно удаляет запаздывание новых строк. Это - зарегистрированное поведение, и необходимо всегда знать о нем при использовании конструкции.

Новые строки в текстовом теле не удалены оператором замены, но они могут также быть удалены при выполнении разделения слова на оболочке, поэтому как это складывается, зависит от того, использовали ли Вы кавычки или нет. Отметьте различие между этими двумя использованиями:

$ echo -n "$(echo -n 'a\nb')"
a
b

$ !! | xxd -p
610a62

$ echo -n  $(echo -n 'a\nb')
a b

$ !! | xxd -p   
612062

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

18
27.01.2020, 19:49
  • 1
    Спасибо Caleb.. Я знал, что разделение слова изменило пробел на одиночный пробел, при закрытии кавычки... Именно поэтому я был больше всего удивлен видеть, что мое запаздывание новой строки исчезает даже при том, что я заключил его в кавычки... Теперь я знаю, что это из-за 'нормального' поведения Замены Команды, отбрасывающей запаздывающую новую строку... О, хорошо, c'est la vie.. и спасибо за ссылку ре –  Peter.O 31.07.2011, 14:21

При использовании замены команды оболочка выполняет команды в подоболочке, возвращая их stdout. в этом процессе, потеря символов IFS их значение (если они не заключаются в кавычки), как рекомендовать простые слова разделения возвратов, таким образом, запаздывающие удалены. Например:

$ echo "$(echo -e '\n')" | wc
 1       0       1

$ echo -e '\n' | wc
2       0       2

и более практически, pwd будет работать, даже если Ваше имя каталога будет иметь промежуточную новую строку, но $(pwd) не будет.

Обычное обходное решение должно добавить что-то в конце Вашей команды и разделить ее после этого.

6
27.01.2020, 19:49
  • 1
    Спасибо Philomath... между прочим, Вы сначала пример является синтаксически неправильным ('туалет' не принимает строку как аргумент).. Для Вас примеры, чтобы иметь смысл, первый мог быть echo "$(echo -e '\n')" | wc, какие выводы 1  0  1, по сравнению с 2  0  2 –  Peter.O 31.07.2011, 13:58
  • 2
    @fred: ой, просто опечатка. –  Philomath 31.07.2011, 14:00
  • 3
    , "преобразованный в пробелы", не является соответствующим объяснением, существует только некоторое включенное разделение. В особенности можно удалить пространство из IFS, и они не будут действовать как разделители. Больше Ваш пример попадает в категорию особого случая, и существует различие между $(pwd) и "$(pwd)", см. ответ Caleb. –  Stéphane Gimenez 31.07.2011, 14:08
  • 4
    PS.. Ваше предложение обычного обходного решения, что я должен был разрешить этого.. –  Peter.O 31.07.2011, 14:19
  • 5
    , "преобразованное в пробелы", видят Word Splitting –  Peter.O 31.07.2011, 15:13

Теги

Похожие вопросы