我经常更改 bash 脚本,并且每次执行“./demo_script.sh”都是重复的。
有没有什么办法可以让我只要按下键盘上的 CTRL+S 就可以自动执行?
答案1
为什么不直接使用!./demo_script.sh
、 、!./demo
或!./
或其他任何快捷方式?或者甚至!.
?您还应该查看!!
。
它们都查看历史缓冲区的内容。
这!!
只是要求 shell 重新执行最后一个命令。
另一些命令要求 shell 执行以给定字符开头的最后一个命令。
的CTRL-S
特殊之处在于它会向正在运行的命令发送停止信号,如果你对 shell 执行此操作,则意味着它会被暂停,直到你用 释放它CTRL-Q
。
你会发现,所有CTRL-<KEY>
事物在某些方面都很特别,你真的不应该干涉它们。
答案2
这是可能的,但并不像你希望的那么简单。
初步说明
您已标记bash 脚本你提到了“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 -x
Bash 启动命令,它既不会为该命令配置终端,也不会为自己配置终端。
根据击键生成击键
如果所描述的行为是一个问题,请考虑以下绑定(而不是上面的绑定):
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 会表现得好像你打字所有这些,因此它将为命令正确配置终端,并且(在命令完成后)再次为自己配置终端。