linux - 使用 Readline 在 bash 中注释掉命令行

标签 linux macos bash unix terminal

情况

我正在用 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 ,但它对我不起作用,因为它只在一个方向上起作用。我还想使用相同的快捷方式取消注释该行。

最佳答案

替代方案:

  1. 在长行结束时按 Ctrl+u
  2. mkdir some_path
  3. Ctrl+y 继续您的工作。

关于linux - 使用 Readline 在 bash 中注释掉命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29985312/

相关文章:

linux - 如何使用find命令查找文件名的目录并删除重复项?

linux - 有什么方法可以像在 python 中一样在 bash 上导入模块吗?

linux - Bash - 如何在写入 csv 时跳过列

linux - 有什么方法可以控制 Bash here 文档中的参数扩展吗?

linux - 通过 ssh 编写 sudo 脚本

linux - 查找文件是否存在于多个 gzip 压缩包中的最快方法?

c++ - 如何以编程方式查找动态库文件的位置?

macos - 您如何在使用 pkgbuild/productbuild 构建的 OS X 安装程序中询问用户问题?

python - 尝试在 OSX El Capitan 上初始化服务器后 Django 挂起

ios - VirtualBox 上的 Mac 操作系统无法识别 Iphone