我需要运行一系列长行 bash 命令。每次尝试时,我都需要更改一些参数并重新运行命令。
我知道最好的情况是用 换行"\",但这只能附加参数。
有没有办法在长 bash 命令中间注入a ?类似或在大多数编辑环境中。"\" + "\n"Shift+EnterCtrl+Enter
例如,我从历史记录中调出了下面的命令,我想对其进行编辑:
$ execute_command -a /path/to/file -b another_option -c third_option
Run Code Online (Sandbox Code Playgroud)
到:
$ execute_command \
-a /path/to/file \
-b another_option \
-c third_option
Run Code Online (Sandbox Code Playgroud)
回答
根据@benjamin-w的建议,可以使用Ctrl-X-E组合键。这将打开默认编辑器,您可以将现有命令分成由 分隔的多行"\",并在退出时将其放在命令行上。
v从技术上讲,在大多数文档中,它是“未绑定的”,但是当我在命令行(在vi模式下)上输入并且需要编辑时,我点击了<ESCAPE>v。我一直在vi模式下运行 ( set -o vi),因此这会将我当前的整个命令缓冲区放入一个vi会话中,在其中我可以使用编辑器的全部功能来添加换行符、更正拼写和标点符号、重新思考我的逻辑等,然后再提交缓冲。当您保存并退出时vi,保存的缓冲区一次一行地输入到解析器,就像您在命令行上按顺序完成它们一样。
请注意,当您退出时,无论您保存还是退出而不进行任何更改,缓冲区都会执行,因此如果您不希望它执行任何操作,请将您的工作保存在某个位置:w somefile,然后删除所有行并保存缓冲区出口。“空”缓冲区是唯一的无操作。
目前我找不到这方面的文档,但我已经在 HPUX 和 SunOS ksh 以及各种版本的 linux bash 中使用它数十年了。
否则,我建议复制,取消,粘贴到您最喜欢的缓冲区/编辑器中,修复它,复制,然后粘贴回命令行,哈哈
$: echo \
> this \
> is \
> all
this is all
Run Code Online (Sandbox Code Playgroud)
只要确保它是该行的最后一个字符即可。
参见此页面了解更多信息。
任何正确引用的换行符都可以包含在您的输出中,因为它们现在是数据的一部分。
$: echo "
> this
> is
> all"
this
is
all
Run Code Online (Sandbox Code Playgroud)
您还可以将它们单独作为数据传递。
$: echo this $'\n' is $'\n' all
this
is
all
Run Code Online (Sandbox Code Playgroud)