我有一个函数,旨在捕获命令输出并缩进每一行:
indent_lines () {
local line
local indent=" "
while IFS= read -r line || [[ -n "$line" ]]; do
# remove \r and replace with \r$indent
echo "$indent $(echo "$line" | sed "s/$(printf '\r')/$(printf '\r')$indent /g")"
done
}
这是如何使用的:
some command 2>&1 | indent_lines
< p >整个some command 2>&1
的输出被导入到indent_lines函数中,每一行输出都将进行缩进。除了在some command
中调用read -p
的情况之外,这种做法都适用,例如:
get_name () {
echo "this is a line of output 1"
echo "this is a line of output 2"
echo "this is a line of output 3"
read -p "enter your name: " user_input
echo
echo "$user_input is your name"
}
输出结果如下:
$ get_name 2>&1 | indent_lines
$ this is a line of output 1
$ this is a line of output 2
$ this is a line of output 3
$
提示符没有显示,而是挂起等待输入。
有没有办法在暂停输入之前显示提示符?
read -p
但是代码中除了在子shell的讨论中没有看到read -p
的使用,而且上下文也不太清楚。你能否提供一个最小化、完整化、可复现化的示例([MCVE])?另外,read -p
主要是 Bash 中的命令,对吧?或许你应该加上 [tag:bash] 标签或者无论如何都加上这个标签。 - Jonathan Lefflerecho "$(get_name)" | indent_lines
而不是get_name | indent_lines
(或者直接将get_name
放在父进程中,get_name > >(indent_lines)
)?echo
和子 shell 没有任何有用的作用,如果get_name
旨在修改进程本地变量,则可能会产生积极的危害。 - Charles Duffy2>&1
,则从命令输出的任何错误都不会被传送到indent_lines
中,提示符也不会缩进。或许您可以修改您的答案以获得正确的输出?请注意我无法修改get_name
。 - Arctelix