Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用Readline注释掉bash中的命令行_Linux_Macos_Bash_Unix_Terminal - Fatal编程技术网

Linux 使用Readline注释掉bash中的命令行

Linux 使用Readline注释掉bash中的命令行,linux,macos,bash,unix,terminal,Linux,Macos,Bash,Unix,Terminal,形势 我正在用bash编写一个很长的命令,最终意识到我忘记满足该命令的先决条件。我想把这个命令存储在某个地方,执行所有的需求,恢复命令并执行它 注意:我希望命令保持在屏幕上 以下是一个例子: $ a very long command --path some_path and more arguments 因此,假设此命令要求some_路径是现有目录。但是,在编写命令时,我意识到我没有创建该目录,因此在执行命令之前,我必须mkdir一些路径 要求 我希望能够做到以下几点: $ a very l

形势

我正在用bash编写一个很长的命令,最终意识到我忘记满足该命令的先决条件。我想把这个命令存储在某个地方,执行所有的需求,恢复命令并执行它

注意:我希望命令保持在屏幕上

以下是一个例子:

$ a very long command --path some_path and more arguments
因此,假设此命令要求some_路径是现有目录。但是,在编写命令时,我意识到我没有创建该目录,因此在执行命令之前,我必须
mkdir一些路径

要求

我希望能够做到以下几点:

$ a very long command --path some_path and more arguments [keystroke -> comment]
$ mkdir some_path
$ [up] [up] [keystroke -> 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"'
最后……问题

你能推荐一个更好的解决方案吗?我可以使用一个映射?主要的重点是消除第二个映射

注释

我了解了
插入注释
,但它不适用于我,因为它只适用于一个方向。我还想使用相同的快捷方式取消对该行的注释。

另一种选择:

  • 在长线的末尾按Ctrl+u
  • mkdir一些路径
  • 按Ctrl+y并继续您的工作

  • 在你正在写的行上使用Ctrl-a Ctrl-k,然后再使用Ctrl-y将其粘贴回,这难道不能实现吗?汤姆,我支持你。或者控制a,
    #
    ,输入,命令,向上,向上,控制a,删除#。似乎是为了一个容易实现的结果付出了巨大的努力。这是一个选择。至少我可以将
    Ctrl-A Ctrl-K
    组合映射到另一个快捷方式。在这种情况下,我不会将命令存储在历史记录中,但同时我也不必返回历史记录来取消对它的注释。谢谢!!无论如何,在演示过程中想象一下这个问题,您需要演示命令语法,但不实际执行它,因此,您希望命令保持在屏幕上。您可以通过按Alt+#Off-topic将一行前缀始终设置为
    ,但可能需要注意的是:
    zsh
    中的命令行编辑器支持命令堆栈。您将当前命令行推到堆栈上,执行mkdir命令,原始命令行将按原样弹出。这是一个与建议类似(且更短)的解决方案,但我需要的是在切换到
    mkdir some_path
    后,让命令在屏幕上可见。接受作为唯一相关答案;)
    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"'