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

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

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

# 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 ответ

Решение

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

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

echo '1a\n2b\n3c\n' | xargs -I % hg log --template '%\n' | sort
# Output
1a
2b
3c
Другие вопросы по тегам