情况
我正在用bash编写一个很长的命令,并最终意识到我忘了满足该命令的先决条件。我想将此命令存储在某处,执行所有要求,恢复命令并执行它。
注意:我希望命令保留在屏幕上
以下是一个例子:
$ a very long command --path some_path and more arguments
因此,假设此命令要求some_path是现有目录。但是,在编写命令时,我意识到我还没有创建该目录,所以在执行命令之前我必须mkdir some_path
。
要求
我希望能够做到以下几点:
$ a very long command --path some_path and more arguments [keystroke -> comment]
$ mkdir some_path
$ [up] [up] [keystroke -> uncomment]
...或
$ a very long command --path some_path and more arguments [keystroke -> comment]
$ mkdir some_path
$ [keystroke -> bring back, uncomment]
我的解决方案
要解决此问题,我使用Readline绑定工具并以下列方式将Control-P
字符映射到自定义脚本:
function postpone {
if [[ ${#READLINE_LINE} -gt 0 ]]
then
if [[ "${READLINE_LINE::1}" == "#" ]]
then
READLINE_LINE="${READLINE_LINE:1}"
else
READLINE_LINE="#$READLINE_LINE"
fi
else
HIST_SIZE=`history | wc -l | tr -s ' ' | cut -d \ -f 2`
for i in $(seq 1 $HIST_SIZE)
do
LINE=`history | sort -r | head -n $i | tail -n 1 | tr -s ' ' | cut -d \ -f 3-`
if [[ "${LINE::1}" == "#" ]]
then
READLINE_LINE="${LINE:1}"
break
fi
done
fi
}
bind -x '"\C-b": postpone'
bind '"\C-p":"\C-b\n"'
最后......问题
你可以建议一个更好的解决方案,我可以使用单一映射吗?主要重点是消除第二个映射。
备注
我了解了insert-comment
bind function,但它对我不起作用,因为它只适用于一个方向。我还想使用相同的快捷方式取消注释该行。
答案 0 :(得分:1)
替代方案:
mkdir some_path