我的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来运行脚本时,它不会等待输入。相反,它只是回应"错误"无限地。我不明白。为什么在手动运行时会起作用,但在启动时运行会卡住?
谢谢!
答案 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
。