【发布时间】:2013-07-05 08:49:14
【问题描述】:
我正在尝试更改我的 Ubuntu Amazon EC2 框上的每日消息 (MOTD),以便当我 SSH 进入时它会显示我的一个目录的 git 状态。
所有默认 MOTD 文件的输出在每行的开头都有两个空格,因此它看起来很好缩进,但是因为我的 git status 输出跨越多行,如果我在它只缩进第一行之前执行 echo -n " "行。
知道如何让它缩进每一行吗?
【问题讨论】:
我正在尝试更改我的 Ubuntu Amazon EC2 框上的每日消息 (MOTD),以便当我 SSH 进入时它会显示我的一个目录的 git 状态。
所有默认 MOTD 文件的输出在每行的开头都有两个空格,因此它看起来很好缩进,但是因为我的 git status 输出跨越多行,如果我在它只缩进第一行之前执行 echo -n " "行。
知道如何让它缩进每一行吗?
【问题讨论】:
将它传递给sed,以便在每行的开头插入2个空格。
git status | sed 's/^/ /'
【讨论】:
sed 销毁,这在某些情况下可能是个问题。
set -euo pipefail 将为您测试它。
基于@Barmar 的回答,这是一种更简洁的方法:
indent() { sed 's/^/ /'; }
git status | indent
other_command | indent
【讨论】:
感谢 @Barmar 和 @Marplesoft 提供了一些不错的简单解决方案 - 这是其他人可能喜欢的另一个变体 - 一个函数,您可以使用 pr 判断缩进级别:
indent() {
local indentSize=2
local indent=1
if [ -n "$1" ]; then indent=$1; fi
pr -to $(($indent * $indentSize))
}
# Example usage
ls -al | indent
git status | indent 2
【讨论】:
ls,您可以使用--color=always 选项:ls -al --color=always | indent。来源:this StackExchange thread
这是我编写的一个函数,也用于缩进 stderr:
function indented {
local PIPE_DIRECTORY=$(mktemp -d)
trap "rm -rf '$PIPE_DIRECTORY'" EXIT
mkfifo "$PIPE_DIRECTORY/stdout"
mkfifo "$PIPE_DIRECTORY/stderr"
"$@" >"$PIPE_DIRECTORY/stdout" 2>"$PIPE_DIRECTORY/stderr" &
local CHILD_PID=$!
sed 's/^/ /' "$PIPE_DIRECTORY/stdout" &
sed 's/^/ /' "$PIPE_DIRECTORY/stderr" >&2 &
wait "$CHILD_PID"
rm -rf "$PIPE_DIRECTORY"
}
像这样使用它:
indented git status
indented ls -al
【讨论】: