关于如何使用“ edit-and-execute-command(Cx Ce)”使用编辑器编辑和执行命令的信息似乎很多,但是我想实现的是采用当前的shell命令,应用某些过滤(使用脚本),然后将其返回以提示进一步批准/手动更改,然后再执行。bash有可能吗?
Escape
+ V
,但仍将执行命令。因此,对于变通办法,我将echo
在前面添加以通过将命令打印到控制台进行检查来执行它。
关于如何使用“ edit-and-execute-command(Cx Ce)”使用编辑器编辑和执行命令的信息似乎很多,但是我想实现的是采用当前的shell命令,应用某些过滤(使用脚本),然后将其返回以提示进一步批准/手动更改,然后再执行。bash有可能吗?
Escape
+ V
,但仍将执行命令。因此,对于变通办法,我将echo
在前面添加以通过将命令打印到控制台进行检查来执行它。
Answers:
0"+y$dd
以下映射中的部分确实是您应该仔细考虑并根据您的口味/工作流程/经验进行调整的部分。
例如,我经常发现自己在缓冲区中以多行结尾,而我只想执行光标所在的那一行;在这种情况下,我可以使用0"+y$dd:%d<CR>
代替0"+y$dd
。
这只是可能的情况之一。
vim
vim
为EDITOR
/ VISUAL
,以便在编辑命令行时使用vim
它进行编辑。au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>
你的~/.vimrc
文件映射Leaderd到行动(其中编辑命令时,你会很少使用)“删除当前行到+
寄存器没有结尾EOL”。
vim
器中完成命令编辑后,请点击EscapeLeaderd。我经常需要做同样的事情,我做如下。(我通常使用set -o vi
in bash
,因此如果使用set -o emacs
默认值,则下面的点1和2是不同的;根据您的问题,看起来点1和2在Ctrl+ x后面是统一的,后面是Ctrl+ e,这很难键入,恕我直言)
(这是您提出问题的地方。)
URxvt
。显然,这只是一种解决方法,包括在删除整个命令之前将已编辑的命令复制到剪贴板中,以使退出编辑器时不执行任何操作。但是这是我自己能得到的最好的。
由于我的EDITOR
(和VISUAL
)等于vim
,因此当我编辑命令时,我在中进行了编辑vim
。
在这方面,我注意到缓冲区的名称为/tmp/bash-fc.random
,其中random
是6个字符的字母数字随机字符串。
如果您vim
用作编辑器,这将为很多可能性提供空间,因为您可以在自己的程序中定义一些映射.vimrc
以执行整个序列Escape0"+y$dd:wq。例如,在编辑命令行时很少使用的命令是Leaderd;。因此,您可以map
在.vimrc
文件中放入以下ping
au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>
因此上述配方中的步骤4变为
在Bash / readline中不可能这样做,但是在zsh中使用edit-command-line
命令是可能的:
darkstar% autoload edit-command-line; zle -N edit-command-line
darkstar% bindkey "^X^E" edit-command-line
现在按Control- x Control- e打开你的编辑器,编辑行,离开编辑器-你会看到更新的命令行,但它不会自动执行。
现在,我想一想,如果我们要坚持下去,也许@kenorb在注释中建议的变体是最好的解决方法(因为似乎不存在解决方案)bash
。
您可以做的是在命令前面加上#
(中的注释字符bash
),而不是echo
。然后,当您退出退出程序时,该命令将无效,您只需按arrow up(或k,如果使用,则set -o vi
)将其删除#
并确认。
请注意,此策略仅添加了几次击键,因此根据键入级别的不同,它可能会非常有效。
这些片段可能使您更接近:
a)替换换行换行符的常规绑定(ctrl-M)
bind -x '"\C-M":date"
b)使用以下命令从历史记录中获取当前行 !#
用您想要的任何脚本替换日期。
c)手动编辑
d)如有必要,可以通过某种方式将!!:p
新命令打印到命令行,但不执行该命令,从而可以手动对其进行编辑。
e)使用ctrl-J提交编辑的命令而不是换行符
否则他们可能不会....
bash中有一个选项可以从历史记录中修改命令而不执行它。我不确定是否可以为此使用脚本,似乎不太可能。虽然,您可以使用历史记录修改器进行修改。
外观如下:
$ shopt -s histverify
$ ls *.sh
script1.sh script2.sh script3.sh script-return.sh
$ !!:s/*/script1/:p
ls script1.sh
$ !!:s/1/2/:p
ls script2.sh
$ !!
$ ls script2.sh
script2.sh
我想向您介绍Bash 的Composure框架(我与之无关):https : //github.com/erichs/composure
它提供draft
和revise
功能听起来像他们可能与你正在试图做什么帮助。这是项目自述文件的(长)引号:
通过让您快速起草简单的Shell函数,将长管道过滤器和复杂的命令分解为可读和可重用的块,镇静将有所帮助。
先草稿,再问问题
精心制作出命令的瑰宝后,请不要将其丢弃!使用
draft ()
并给它起个好名字。这会将您的最后一个命令存储为以后可以重用的功能。认为它像草稿。$ cat servers.txt bashful: up doc: down up-arrow $ cat servers.txt | grep down doc: down $ draft finddown $ finddown | mail -s "down server(s)" admin@here.com
修改,修改,修改!
现在,您已经拥有最小的Shell函数,您可能希望通过重构和修订使其更好。使用该
revise ()
命令在您喜欢的编辑器中修改Shell函数。
- 使用输入参数概括函数
- 添加或删除功能
添加用于文档的支持元数据
$ revise finddown finddown () { about finds servers marked 'down' in text file group admin cat $1 | grep down } $ finddown servers.txt doc: down
edit-and-execute-command
。