我怎样才能告诉 bash top 在我按下任意键时停止回显文​​本?

我怎样才能告诉 bash top 在我按下任意键时停止回显文​​本?

我正在为 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;'

相关内容