在后台运行时获取用户输入

nma*_*mat 5 shell keyboard-shortcuts terminal input x11

我正在编写一个脚本,提示用户输入并在之后进行一些处理。我是read用来获取数据的,但后来我注意到,当脚本使用键盘快捷键运行时(我在 Ubuntu 的键盘快捷键列表中添加了一个条目),它会忽略read并继续执行其余代码。

如何使用像这样在后台运行的脚本读取用户输入?

Gil*_*il' 8

如果我理解正确,您是直接从 GUI 环境运行脚本,而不是从终端内部运行。

终端为脚本提供了一种接收输入的方式。如果您通过菜单项或键盘快捷键从 GUI 运行脚本,则脚本的输入与任何内容都没有关联(这称为空内容/dev/null),因此当您要求读取一行时,该read命令会显示没有内容可读取(文件结束)。

您有两种解决方案:更改调用脚本的方式,或更改脚本。前者更简单,有时允许您的脚本在终端内执行。后者更复杂,但更灵活。

您可以轻松更改脚本以在终端中运行。不是为 设置键盘快捷键/path/to/script,而是为xterm -e /path/to/scriptgnome-terminal -e /path/to/script或您喜欢的任何终端模拟器设置键盘快捷键。终端窗口将在您按下该键后立即出现,并在您的脚本终止时消失。

或者,您可以更改脚本以通过 GUI 窗口而不是从其标准输入读取输入。Zenity是一个常见的选择(有一个Ubuntu 包 安装 zenity http://bit.ly/software-small)。在您的脚本中,您可以[ -t 0 ]用来测试它是否在终端中运行。

if [ -t 0 ]; then
  echo "What is your favorite color?"
  read -r color
else
  color=$(zenity --entry --text "What is your favorite color?")
fi
Run Code Online (Sandbox Code Playgroud)