Mercurial сворачивает линии в одну строку при выводе по трубопроводу

305
Joe

Я хотел бы отсортировать на основе вывода команды mercurial (hg). Вывод из hg logсвернут в одну строку при конвейерной связи с другой командой, но я хочу сохранить отдельные строки.

Вот минимальный воспроизводимый случай:

# Initial setup mkdir /tmp/hgbug; cd /tmp/hgbug; hg init;  touch README.md; hg add README.md h commit -m "initial commit"  # Bug - the echo command replaces a complex find command echo '1a\n2b\n3c\n' | xargs -I % hg log --template '%' | sort  # Actual Output # 1a2b3c  # Expected Output # 1a # 2b # 3c 

Интересно то, что Mercurial не сворачивает строки, когда выходные данные не передаются по каналу и не перенаправляются.

echo '1a\n2b\n3c\n' | xargs -I % hg log --template '%' # Actual Output # 1a # 2b # 3c 

Как предотвратить сгибание строк в Mercurial при перенаправлении вывода?

Чтобы уточнить, вот более полный пример, сравнивающий вывод hgс echoиспользованием обоих xargsи whileцикла.

#!/bin/bash cd /tmp/hgbug  echo '# hg log - xargs' echo $'1a\n2b\n3c' | xargs -I {} hg log --template "hg-{}" | sort  echo echo '# plain echo - xargs' echo $'1a\n2b\n3c' | xargs -I {} echo "echo-{}" | sort  echo echo '# hg log - while read' echo $'1a\n2b\n3c' | while read -r file; do hg log --template "hg-$file"; done | sort  echo echo '# plain echo - while read' echo $'1a\n2b\n3c' | while read -r file; do echo "echo-$file"; done | sort 

Этот скрипт выводит следующее:

# hg log - xargs hg-1ahg-2bhg-3c  # plain echo - xargs echo-1a echo-2b echo-3c  # hg log - while read hg-1ahg-2bhg-3c  # plain echo - while read echo-1a echo-2b echo-3c 
-1
`xargs` устанавливает параметр для каждой строки, извлеченной из ввода. Это зависит от целевой программы, чтобы решить, как обрабатывать несколько параметров. Если вам нужен один параметр за раз, не используйте `xargs`; вместо этого используйте `find ... -exec hg log --template {} \;` или `find ... | пока читаешь -r файл; do hg log - шаблон "$ file"; done` (обратите внимание на мое использование и пропуск цитат). AFH 7 лет назад 0
Я до сих пор не понимаю, где рушится вывод. `GNU xargs` с параметром` -I` подразумевает `-L 1` или одну строку на вызов. Итак, есть 3 вызова `hg log`. Я бы хотел использовать xargs для использования функции параллелизма. Если я использую echo вместо hg, все работает как положено. Joe 7 лет назад 0
Я добавил более полный пример, сравнивающий `hg` с` echo`, чтобы проиллюстрировать проблему. Joe 7 лет назад 0
Оказывается, во время чтения была красная сельдь. Проблема заключалась в том, что `hg log` не добавляет завершающие символы новой строки при перенаправлении вывода. Поведение имеет смысл, но удивляет, когда пытается выяснить разницу между интерактивным и перенаправленным выходом. Joe 7 лет назад 0

1 ответ на вопрос

0
Joe

hg logне добавляет завершающий символ новой строки в вывод, когда установлен --templateфлаг, а команда оболочки перенаправлена ​​или передана другой команде.

Чтобы это работало, вам нужно добавить новую строку в строку шаблона следующим образом:

echo '1a\n2b\n3c\n' | xargs -I % hg log --template '%\n' | sort # Output 1a 2b 3c 

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