如何在bash脚本

时间:2017-06-30 12:13:58

标签: bash

是否可以在bash脚本中输入键盘快捷键?例如,我尝试输入^d来替换control + d(注销)但没有成功。

ubuntu@vfleet:~$ ^d
-bash: :s^d: substitution failed
ubuntu@vfleet:~$ ^D
-bash: :s^D: substitution failed

我正在使用screen在后台运行django开发服务器。将特定屏幕作为守护程序运行的命令之一是control + a + d。目标是能够将控制+ a + d输入到bash脚本中。例如:

python manage.py runserver
^a + d

这可能吗?

修改 Eric Renouf在下面的评论中链接了一种避免屏幕键盘快捷方式的有效方法。 screen -d -m sh -c "python manage.py runserver"将启动开发服务器作为守护进程。对于我的特定问题,这是一个很好的解决方案,但是对于手头的原始问题有一个解决方案仍然很好。

4 个答案:

答案 0 :(得分:1)

您可能应该首先启动命令而不首先附加到屏幕会话,例如

screen -d -m python manage.py runserver

但是如果由于某种原因你无法做到这一点,你可以通过以下方式脱离目前正在进行的屏幕会话:

screen -S "$STY" -X detach

screen将当前会话信息保存在STY中,因此我们会使用它来确保我们与正确的会话进行交互(如果有很多话)。然后我们使用-X向该会话发送命令,在这种情况下,我们的命令将是detach,它将分离所有连接的会话,包括用于执行该命令的会话

因此,虽然这实际上并没有发送击键,但它确实突出显示您可以发送另一个命令来完成目标。这里detach代替 ctrl + a + d 。发送quit或正在运行exit通常可以替换 ctrl + d

另一种解决方法是使用expect然后您可以使用它来发送包含控制字符或其十六进制值的字符串。

答案 1 :(得分:1)

大约2年后。 xdotool包是这里的解决方案。

xdotool key ctrl+d

Full reference

答案 2 :(得分:-1)

请参阅内置的bind bash,例如[CTRL] + [L]将执行ls

bind '"\C-l": "ls\n"'

# to dispay current bindings
bind -p

编辑:我误解了这个问题,纯粹的bash是不可能的,另见https://unix.stackexchange.com/questions/87831/how-to-send-keystrokes-f5-from-terminal-to-a-process

答案 3 :(得分:-1)

如果偶尔需要交互输入控制字符(例如:^ M):使用 ctrl v ctrl M < / KBD>。要输出转义: ctrl v Esc

例如,将文本设置为绿色(在vt100 / xterm /许多公共终端中):您需要输出:

echo&#34; ctrl v Esc [0; 32m这里的一些绿色文字 ctrl v Esc [0m并在这里恢复正常。&#34;

但&#34;本身&#34;方法是使用printf代替,因为您可以轻松地复制/粘贴(或通过电子邮件发送,或将其作为简单文本放在脚本中):

_green_="$(printf '\033[0;32m')"  #green. This is only regular text, so can be copy/pasted nicely
_norm_="$(printf '\033[0m')" #goes back to normal.
echo "This is ${_green_}GREEN here${_norm_} and this is regular again."

现在你想用ctrl-d结束一个脚本:这不会真正起作用:当你的登录shell读取一个文件时,它会以交互方式工作:stdin(默认情况下你的终端链接到你的键盘,即输入在stdin你键入什么,直到shell关闭stdin(当你键入exit,例如)或者你输入 ctrl d 这被shell解释为&#34 ;关闭此文件&#34;(stdin),然后退出交互式shell,并关闭其输入文件。

在脚本中,您将使用exit 0(以&#34; true&#34;退出)或exit 12(以错误代码12退出)作为示例。在函数中,return 0代替(退出将退出整个脚本,而不仅仅是函数)