我正在为gnome-terminal编写一个自定义的启动命令,我的意图是在每次启动它时显示一条欢迎消息。
该消息正确显示,我对其进行了编码,以使字母以0.09s的时间速率一一出现:
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如何读取单行命令组合。
当我尝试从配置文件(我在其中编写用于启动的自定义命令的文件)中执行此代码时,出现了主要问题。重击返回:
No passwd entry for user 'Successful.; else echo Test'
Welcome
奇怪的是,当我su -c
在默认配置文件中尝试相同的命令(不带)时,它可以正常运行,但是如果我使用su -c尝试,则不能。
尝试使用默认配置文件中的其他命令,我输入su -c "echo Hi"
并运行良好。为什么会这样呢?你有什么主意吗?
将整个命令用单引号引起来,而不用双引号引起来。首先要注意的是您有一个变量($ key)。用双引号括起来,在将其作为给定参数之前将被外壳替换su
。第二件事是关于使用双引号将您当前所拥有的引号与之匹配,参数将像这样拆分:
su
--command
read -n 1 -s key; if [ <value of $key or nothing> == g ]; then echo Test
Successful.; else echo Test
Failed.; fi;
将整个args括在单引号中,可以通过按原样传递此字符串作为的第二个参数来解决两个问题,避免变量替换并解决拆分怪异性su
。
奖励:作为一般注意事项,请尽可能避免在测试中使用双括号,这是一种bashism(仅适用于bash的语法,可以用更兼容的对应部分代替)
以下版本应该可以正常工作。
su --command 'read -n 1 -s key; if [ "$key" == "g" ]; then echo "Test Successful."; else echo "Test Failed."; fi;'
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句