我正在为 gnome-terminal 编写自定义启动命令,我的目的是每次启动时显示一条欢迎消息。
消息显示正确,我对其进行了编码,以使字母以 0.09 秒的时间速率逐个出现:
echo -n "W"
sleep 0.09
echo -n "e"
sleep 0.09
echo -n "l"
sleep 0.09
echo -n "c"
sleep 0.09
echo -n "o"
sleep 0.09
echo -n "m"
sleep 0.09
echo -n "e"
sleep 0.09
在测试的时候,我觉得如果能够停止字母的出现并su
直接开始,那就太舒服了。我想出了以下解决方案:
su --command "read -n 1 -s key; if [[ "$key" == "g" ]]; then echo "Test Successful."; else echo "Test Failed."; fi;"
su -c
如果我不想让 bash 生气并抛出 ,我必须使用illegal action: read -n
。此代码片段仅用于调试目的,因为我想测试 bash 如何读取单行命令组合。
当我尝试从配置文件(我在其中编写自定义启动命令的文件)执行此代码时,主要问题出现了。Bash 返回:
No passwd entry for user 'Successful.; else echo Test'
Welcome
奇怪的是,当我在默认配置文件中尝试相同的命令(不带su -c
)时,它可以完美运行,但如果我使用 su -c 尝试,则不行。
尝试使用默认配置文件中的其他命令,我输入su -c "echo Hi"
并运行正常。为什么会发生这种情况?你知道吗?
答案1
将整个命令括在单引号中,而不是双引号中。首先要注意的是您有一个变量 ($key)。用双引号括起来后,shell 会在将其作为参数之前替换它su
。第二件事是关于引号与您当前拥有的内容相匹配,使用双引号,参数将像这样拆分:
- arg0:
su
- 参数1:
--command
- 参数2:
read -n 1 -s key; if [ <value of $key or nothing> == g ]; then echo Test
- 参数3:
Successful.; else echo Test
- 参数4:
Failed.; fi;
将整个参数括在单引号中可以修复这两个问题,避免变量替换,并修复拆分怪异现象,通过将此字符串按原样传递作为的第二个参数su
。
奖励:一般来说,尽可能避免在测试中使用双括号,这是一种 bashism(仅适用于 bash 的语法,可以用更兼容的对应部分替换)
以下版本应该可以按预期工作。
su --command 'read -n 1 -s key; if [ "$key" == "g" ]; then echo "Test Successful."; else echo "Test Failed."; fi;'