当没有终端的情况下以可执行文件运行时,如何从 bash 脚本获取用户输入?

当没有终端的情况下以可执行文件运行时,如何从 bash 脚本获取用户输入?

我正在尝试编写一个 bash 脚本,它接受一些用户输入并根据输入进行处理。

该脚本是可执行的,并且有一个shebang。

该脚本有点像这样:

#!/bin/bash
read name -p "Enter your name" 
echo $name >> namelist.txt

我不希望用户在终端中打开脚本。脚本被设为可执行 (chmod +x),双击脚本即可运行。但它不会暂停以接受输入,文件仍为空。

答案1

您要么必须有 GUI,要么必须有终端供用户输入。如果用户在 Nautilus 等程序中打开脚本,则没有 stdin,因此 read 会立即返回。一种可能的解决方案是让脚本打开一个新的终端并在其中执行自身,如下所示:

x-terminal-emulator -e $0

使用 x-terminal-emulator 时,会调用默认的终端仿真器。这适用于 Debian 和 Ubuntu,我不知道其他发行版是否适用。当然,您可以调用特定终端,如 xterm、konsole 或任何其他终端。

$0是脚本的文件路径,因此它总是有效。

您还需要确保它不会递归打开更多终端。一种可行的方法是检查您是否可以从 stdin 读取,就像您已经做的那样:

除非遇到文件结束字符、读取超时或者将无效的文件描述符作为 -u 选项的参数提供,否则读取命令的返回码为零。

因此检查返回值,如果它是!= 0,则像上面一样打开新终端,否则不打开。

例子:

#!/bin/bash

read -p "Enter first value: " first
# Check return value of last command with $?
if [[ $? != 0 ]]; then
        x-terminal-emulator -e $0
else
        echo $first
        read -p "Enter more: " more
        echo $more
fi

这个问题如果您需要在程序完成后保持终端打开。

答案2

随机的尝试让我找到了解决方案。

当您双击 Nautilus 中的可执行文件时,会打开一个弹出窗口,要求您“运行”脚本(不带控制台),或“在终端中运行”,或在默认文本编辑器中“打开”脚本。

选择“在终端运行即可达到目的”。

相关内容