Bash历史记录 - 记住转义的换行符

4

我有很长的管道命令链,我希望将其格式化为多行(并使用“fc”进行进一步编辑)

我如何让bash历史记录记住为格式化添加的转义换行符?

例如,如果我输入:

$ echo a b c \
>  | grep a
a b c

历史上刻画它时,已经去掉了换行符:

$ echo a b c  | grep a

我知道可以使用shopt -s lithist命令来显示非转义的换行符: 例如,运行以下命令:

$ shopt -s lithist

下面的命令:
$ for X in a b c; do
> echo $X
> done
a
b
c

被召回的含义是:
$ for X in a b c; do
echo $X
done

但这不能保留转义换行符的格式(这些是用来格式化管道链的)。

1个回答

4

我认为你想要的并不完全可能。Bash手册中指出:

If a \<newline> pair appears, and the backslash is not
itself quoted, the \<newline> is treated as a line continuation (that
is, it is removed from the input stream and effectively ignored).

您可以通过使用 lithist shell 选项来解决这个问题,只需要重新格式化您的代码。因此,不要像这样写:

$ echo a b c \
>  | grep a
a b c

做这个:
$ echo a b c |
> grep a

实际上,您并不需要在行末加\ - 如果您可以告诉bash接下来会有输入,它会等待下一行。(您可能已经知道这个,但是)这也适用于多行输入:

$ echo 'one
> two
> three'
one
two
three

编辑:针对下面评论中提出的问题,如何在不同行上传递多个命令行选项。

我所能想到的唯一方法是事先在数组中定义这些选项,然后将其作为命令行参数传递。例如:

$ opts=(
> -s 'test'
> someone@example.com
> )
$ mutt ${opts[*]}  # launches: mutt -s someone@example.com

谢谢!这解决了我大部分的使用情况。有没有什么技巧可以让命令行开关每行一个,像这样: mycommand
--name1 --value1
--name2 --value2
...
- user3740394
嗯...我能想到的唯一办法就是...好吧,我会更新答案。 - pgl
真希望bash不会为了历史记录而丢弃那些信息:( 但是这个解决方法现在看起来还不错-谢谢! - Eric Cousineau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接