我编写了一个简单的 .desktop 程序并附带脚本。它最近运行正常,但似乎无缘无故地停止了。它现在只是打开一个终端(预期),但它不会运行程序的其余部分,而是立即关闭窗口。基本上,它会打开然后立即关闭终端窗口,而不会运行(或看起来如此)任何脚本。
以下是两者的代码,首先是脚本,然后是 .desktop 文件:
#!/bin/bash
selection=
until [ "$selection" = "ENTER" ]; do
echo "
SHUTDOWN:
C - Cancel shutdown and quit
ENTER - Accept shutdown timer (3 hours) and quit
"
read selection
echo ""
case $selection in
[Cc]) exit;;
"") echo "Shutting down... 'sudo shutdown -c' to cancel"
sleep 5
sudo shutdown -h 180
*) echo "Please enter either C or Press [ENTER]"
esac
done
这是桌面文件:
[Desktop Entry]
Name=Shutdown Script
Comment=shutdown in 3 hours
Exec="/home/nate/Update-Clean/shutdown script"
Terminal=true
Type=Application
Icon=/home/nate/Update-Clean/icons/computer-fail.png
Name[en_US]=Shutdown
它怎么停止工作了?!
(此外,如果您还没有注意到,我想要一个简单的脚本来在一定时间后关闭计算机。这只是我写的第二篇文章,所以如果它有错误或者您有建设性的批评,请务必!)
万分感谢!
编辑:
我在脚本中添加了一个简单的“exit;;”。难道这就是全部吗?
改变:
case $selection in
[Cc]) exit;;
"") echo "Shutting down... 'sudo shutdown -c' to cancel"
sleep 5
sudo shutdown -h 180
exit;;
*) echo "Please enter either C or Press [ENTER]"
答案1
始终通过从命令行运行脚本来尝试它。如果你这样做,你会看到以下消息
:~$ ./test.sh
./test.sh: line 20: syntax error near unexpected token `)'
./test.sh: line 20: ` *) echo "Please enter either C or Press [ENTER]"'
如果你查阅 bash 手册,你会看到以下语法:
case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
这意味着在要执行的命令之后,您需要添加一个;;
(不一定在exit
语句之后!)以下case
语句也有效:
case $selection in
[Cc]) exit;;
"") echo "Shutting down... 'sudo shutdown -c' to cancel"
sleep 5
sudo shutdown -h 180
;;
*) echo "Please enter either C or Press [ENTER]"
;;
esac
好的,但这个答案很无聊。你知道吗——你想要一个交互式程序。你可以在 GUI 中启动它(通过单击图标)。为什么不使用(太酷了!)禅意:
#!/bin/bash
if zenity --question --text "Shutdown in 3 hours?" ; then
zenity --info --text "Shutdown has been scheduled"
sudo shutdown -h 180
else
zenity --info --text "Shutdown CANCELLED"
fi