【发布时间】:2019-04-16 23:10:07
【问题描述】:
我正在尝试使用 zenity 在 bash 脚本中从用户那里获取输入。 (Zenity 是一个 bash 可调用的 gui 工具包“东西”)
这是我目前的尝试
#!/bin/bash
if [[ true ]]
then
# send a message to ask if data should be saved
# do some form of copy to save the data
zenity --question --title="Ramdisk Unmount" --timeout=0 --text="Save ramdisk contants to disk?" --ok-label="Yes" --cancel-label="No"
rvar=$?
#echo $rvar > /media/ramdisk/returnval
if [[ $rvar == 0 ]]
then
DIR=$(zenity --file-selection --title="Ramdisk Unmount" --directory)
CODE=$?
echo $CODE
echo $DIR
case $CODE in
0)
echo "dir=$DIR"
;;
1)
echo "No directory selected"
;;
-1)
echo "An error occured"
;;
esac
echo $DIR
echo $DIR > /media/ramdisk/dir
else
rm -rf /media/ramdisk/*
fi
#umount /media/ramdisk
else
false
fi
read -n1 -r -p "Press Enter to continue"
注意zenity版本是3.22.0
包括第一个 zenity 命令在内的前几行似乎可以正常工作,尽管在我尝试时很奇怪
rvar=`zenity --question --title="Ramdisk Unmount" --timeout=0 --text="Save ramdisk contants to disk?" --ok-label="Yes" --cancel-label="No"`
这似乎不起作用,并且
rvar=$(zenity --question --title="Ramdisk Unmount" --timeout=0 --text="Save ramdisk contants to disk?" --ok-label="Yes" --cancel-label="No")
似乎也没有按预期工作。 (在这两种情况下echo $rvar 都打印了一个空白行。)我认为这可能与我目前遇到的问题有关,即...
目前 bash 脚本似乎在第二个 zenity 命令之后终止。在 zenity 对话框中选择的路径被打印到(我假设是)stdout,但是没有进一步发生,脚本只是退出并返回到 bash 终端。
echo $CODE 没有打印任何代码。
echo $DIR 没有打印任何内容。
可能出了什么问题?
【问题讨论】:
-
仅供参考,
[[ true ]]的行为与[[ false ]]相同(因为不是空的,两个字符串都是真实的)。考虑while true或其惯用的等价物while :; do,以避免给读者留下关于布尔值如何在shell 中工作的错误暗示。 -
@CharlesDuffy 两个好问题 - 至于第二个我不知道。如果我直接在 bash 终端中运行命令,它似乎可以工作。至于第一个,这暂时只是一个占位符 - 我应该删除这个 if 语句,但我认为这不是问题的原因?
-
同意;如果我知道问题的原因,我会添加答案而不是评论。手头没有 zenity 可供测试,因此只是 kibitzing。
-
...好吧,我安装了 zenity,并且至少可以确认您的一个观察结果 --
zenity --question不 向标准输出写入任何内容,而是指定它的调用者仅通过退出状态选择了哪个布尔选项。 -
echo $CODE打印 nothing,顺便说一句,这是一个很好的提示,CODE=$?根本没有在您当前的上下文中运行。
标签: bash variables return-value zenity