情况
我正在用 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 绑定(bind)工具并通过以下方式将 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 ,但它对我不起作用,因为它只在一个方向上起作用。我还想使用相同的快捷方式取消注释该行。
最佳答案
替代方案:
- 在长行结束时按 Ctrl+u。
mkdir some_path
- 按 Ctrl+y 继续您的工作。
关于linux - 使用 Readline 在 bash 中注释掉命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29985312/