Mercurial 在管道输出时将多行折叠成一行

Mercurial 在管道输出时将多行折叠成一行

我想根据 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

hg log--template设置标志时不会在输出中添加尾随换行符shell 命令被重定向或通过管道传输到另一个命令。

为了使其工作,您需要将换行符添加到模板字符串中,如下所示:

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

相关内容