![当没有终端的情况下以可执行文件运行时,如何从 bash 脚本获取用户输入?](https://linux22.com/image/1501589/%E5%BD%93%E6%B2%A1%E6%9C%89%E7%BB%88%E7%AB%AF%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E4%BB%A5%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E8%BF%90%E8%A1%8C%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E4%BB%8E%20bash%20%E8%84%9A%E6%9C%AC%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E8%BE%93%E5%85%A5%EF%BC%9F.png)
我正在尝试编写一个 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 中的可执行文件时,会打开一个弹出窗口,要求您“运行”脚本(不带控制台),或“在终端中运行”,或在默认文本编辑器中“打开”脚本。
选择“在终端运行即可达到目的”。