每次按下 CTRL + S 时如何自动运行 bash 脚本?

每次按下 CTRL + S 时如何自动运行 bash 脚本?

我经常更改 bash 脚本,并且每次执行“./demo_script.sh”都是重复的。

有没有什么办法可以让我只要按下键盘上的 CTRL+S 就可以自动执行?

答案1

为什么不直接使用!./demo_script.sh、 、!./demo!./或其他任何快捷方式?或者甚至!.?您还应该查看!!

它们都查看历史缓冲区的内容。

!!只是要求 shell 重新执行最后一个命令。

另一些命令要求 shell 执行以给定字符开头的最后一个命令。

CTRL-S特殊之处在于它会向正在运行的命令发送停止信号,如果你对 shell 执行此操作,则意味着它会被暂停,直到你用 释放它CTRL-Q

你会发现,所有CTRL-<KEY>事物在某些方面都很特别,你真的不应该干涉它们。

答案2

这是可能的,但并不像你希望的那么简单。


初步说明

  • 您已标记你提到了“bash 脚本”,但是不太清楚你的交互式 shell 是否是 Bash。我认为这是。

  • ./demo_script.sh是相对路径。我将使用它来简洁。为了能够不管您身处哪个目录都可以运行脚本,请使用/full/path/to/demo_script.sh或 甚至(cd /full/path/to && ./demo_script.sh)在需要时使用。


Ctrl+s很特别

首先,Ctrl+s通常用于停止(暂停)输出。它告诉终端停止传递数据当前正在运行的命令(或 shell,或其他任何东西)想要写入终端。该命令可能会继续,但它并不知道,直到它尝试写入某些内容时才会发生任何变化。如果它尝试写入某些内容,那么它将被阻止或注意到。

如果您的终端配置为以Ctrl这种s方式工作,则Ctrl+s将无法访问正在运行的任何程序。想要使用Ctrl+的程序s可能会重新配置终端(并且可能在退出之前恢复以前的设置)。

运行stty -a | grep 'stop ='后你很可能会看到(除其他外)stop = ^S;这意味着Ctrl+的s工作方式如上所述。

要么选择其他组合,要么告诉终端不要捕获Ctrl+ s。我假设您确实想使用Ctrl+ s。这是告诉终端不要捕获它的方法:

stty stop ''

Ctrl现在你可以告诉你的交互式 shell 对+做出反应s。继续阅读。


击键时执行命令

要告诉交互式 Bash 在从终端./demo_script.sh读取时运行,请调用以下命令:^S

bind -x '"\C-s":"./demo_script.sh"'

这是运行命令最简单的方法bind -x。但它可能仍会出现问题。问题是,如果您以这种方式运行命令,那么它将找到具有适合 Bash 读取命令时的设置(由 Bash 强加)的终端。这些设置与适合 Bash 运行命令时的设置不同。Bash 来回更改终端设置,正是因为当 Bash 显示提示符并允许您键入和编辑命令行时,适合脚本和命令的设置并不是 Bash 想要的。

./demo_script.sh将发现终端具有意外设置。这可能会导致终端输出和/或输入处理不当(损坏甚至丢失)。

如果脚本改变了终端的设置并且没有将其改回来,那么脚本退出后,Bash 就会发现意外的设置。

换句话说,如果从bind -xBash 启动命令,它既不会为该命令配置终端,也不会为自己配置终端。


根据击键生成击键

如果所描述的行为是一个问题,请考虑以下绑定(而不是上面的绑定):

bind '"\C-s":"\C-u ./demo_script.sh\C-j"'

这将使 Bash 对+Ctrl做出反应s

  • “打字” Ctrl+u就像你打了它一样;

    (这个组合是unix-line-discard默认的,我假设你没有改变它,我使用它以防命令行不为空时按下Ctrl+ ;)s

  • 然后“打字”,./demo_script.sh就像你输入的那样;

    (前导空格将阻止 Bash 将命令保存到历史记录中;如果愿意,可以删除该空格;)

  • 然后“输入” Ctrl+j就像你点击一样Enter

此变体会注入按键。Bash 会表现得好像你打字所有这些,因此它将为命令正确配置终端,并且(在命令完成后)再次为自己配置终端。

相关内容