2017-02-25 14 views
0

我有一个问题,而我的RPi真正的循环。我希望它在启动后始终等待用户输入。下面的脚本完美的作品时,我手动运行它:虽然真正的循环完美手动运行,但在启动时运行卡住

#!/bin/bash 

while true; do 
    read input 
    if [ "$input" = "1" ]; then 
    echo "message1" 
    elif [ "$input" = "2" ]; then 
    echo "message2" 
    elif [ "$input" = "3" ]; then 
    echo "message3" 
    else 
    echo "error" 
    fi 
done 

但是当我通过增加在启动时运行脚本,它rc.local中它不会等待输入。相反,它只是无限回响“错误”。我不明白。为什么在手动运行时工作,但在启动时运行会卡住?

谢谢!

+3

当启动脚本正在运行时,它们的输入没有连接到控制台。 – Barmar

+1

查看https://ubuntuforums.org/showthread.php?t=1602381 – Barmar

回答

2

您无法等待未连接到终端的外壳中的用户输入。启动脚本不会在交互式shell中执行,因此您所看到的是预期的:read失败,返回空字符串,并导致达到else条件。

也许你真正想要的是从shell的启动脚本调用你的脚本,以便在登录时向用户显示它。查看shell/disto的文档以知道使用哪个脚本。如果标准输入连接到终端

[ -t 0 ] || exit 

[ -t 0 ]返回0:

你可能想在你的脚本的开头添加这样的事情。请注意,如果脚本是在其自己的shell中执行而不是执行的,则“exit”会导致shell执行源代码退出:您可能希望将代码放入函数中,并使用return而不是exit,或者使用作为包含其余代码的if/then/fi块的条件进行测试。

另外,case语句可能比级联elif子句更具可读性。

+0

谢谢!从.bashrc运行脚本的窍门!我一定会考虑使用'case'声明而不是'elif',谢谢你的建议! – Phaeton

1

正如@Fred提到的那样,你的命令将无法达到目的,主要是因为该脚本根本没有连接到任何交互式终端。

通过了解rc.local文件:https://www.raspberrypi.org/documentation/linux/usage/rc-local.md应该清楚它不起作用的原因。脚本,这种方式,只要Pi启动就会执行。不过,您希望它在每个用户提示符下执行。它在你已经交互的shell中工作,因为它写得很好,非常非常正确 - 耶!

而且所有的好,从@Fred建议,你应该尝试,如果你想读一些用户输入,包括您.bashrc文件,该文件是被解释用户随时里面的文件脚本(PI ,作为默认值,在/home/pi/.bashrc)进入交互式shell。

如果你想要的是让它全球,当在交互的任何用户登录时,你可以将它添加到“全局” .bashrc。欲了解更多信息,请登录:https://unix.stackexchange.com/questions/36762或更好的!检查了这一点:http://www.linuxfromscratch.org/blfs/view/svn/postlfs/profile.html

最后,关于脚本本身:因为它是一个简单的while环,它使用read得到一些用户输入(并再次,@Fred是对有关case声明),也可以是例如,使用控制-C(^ C),通过发信号通知read过程停止。因此,如果您想要捕获这些信号,您应该看到help trap(例如:trap 'echo "YOU WON'T STOP ME"' INT KILL TERM不会让您使用^ C杀死进程 - 谨慎使用它),并列出可能的信号,请使用kill -l

+0

小心:每次shell以交互方式启动时(包括何时不是登录shell),通常会调用'.bashrc'。这意味着当你从交互式会话中启动Bash时,会执行什么内容,这可能会(或可能不会)成为你想要的。看到这里:https://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files。 – Fred

+0

非常感谢您的额外提示和那些真正有用的链接!一切正常工作! :) – Phaeton

相关问题