而真正的循环在手动运行时效果很好,但在启动时运行时会卡住

时间:2017-02-25 00:05:17

标签: bash while-loop

我的RPi上存在真正的循环时遇到问题。我希望它在启动后始终等待用户输入。以下脚本在我手动运行时非常有效:

*** Error renewing session: Optional(Error Domain=com.spotify.auth Code=400 "No refresh token available in the session!" UserInfo={NSLocalizedDescription=No refresh token available in the session!})

但是当我在启动时通过将脚本添加到rc.local来运行脚本时,它不会等待输入。相反,它只是回应"错误"无限地。我不明白。为什么在手动运行时会起作用,但在启动时运行会卡住?

谢谢!

2 个答案:

答案 0 :(得分:2)

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

也许你真正想要的是从shell的启动脚本中调用你的脚本,以便在登录时呈现给用户。查看shell / disto的文档以了解要使用的文件。 / p>

您可能希望在脚本的开头添加类似的内容:

[ -t 0 ] || exit
如果标准输入连接到终端,则

[ -t 0 ]返回0。请注意,如果脚本是源代码而不是在自己的shell中执行,那么"退出"将导致执行源的shell退出:您可能希望将代码放在函数中并使用return而不是exit,或者将测试用作if/then/fi块的条件包含其余代码。

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

答案 1 :(得分:1)

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

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

除了来自@Fred的所有好建议之外,如果您想阅读一些用户输入,您应该尝试将您的脚本包含在.bashrc文件中,该文件是每当用户(pi,默认情况下,在/home/pi/.bashrc中)进入交互式shell时,就会被解释。

如果你想要的是全局,当任何用户以交互方式登录时,你可以将它添加到" global" .bashrc。如需进一步阅读:https://unix.stackexchange.com/questions/36762或者更好!看看这个:http://www.linuxfromscratch.org/blfs/view/svn/postlfs/profile.html

最后,关于脚本本身:因为它是一个简单的while循环,使用read来获取一些用户输入(同样,@ Free是关于case的声明),它可以通过发信号read进程来停止,例如,使用control-C(^ C)。所以,如果你想捕获这些信号,你应该看到help trap(例如:trap 'echo "YOU WON'T STOP ME"' INT KILL TERM不允许你使用^ C来杀死进程 - 小心使用它,并且要列出可能的信号,请使用kill -l