我正在尝试编写一个 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 中的可执行文件时,会打开一个弹出窗口,要求您“运行”脚本(不带控制台),或“在终端中运行”,或在默认文本编辑器中“打开”脚本。
选择“在终端运行即可达到目的”。