Как мне заставить 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). Заключенная в двойные кавычки, она будет заменена оболочкой перед тем, как сделать ее аргументом, указанным в su. Второе, что касается соответствия кавычек тому, что у вас есть в данный момент, с двойными кавычками аргумент будет разделен следующим образом:

  • арг0: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.

Бонус: как общее замечание, избегайте двойных скобок для тестов, когда это возможно, это башизм (синтаксис, который работает только с bash и может быть заменен более совместимым аналогом)

Следующая версия должна работать так, как и ожидалось.

su --command 'read -n 1 -s key; if [ "$key" == "g" ]; then echo "Test Successful."; else echo "Test Failed."; fi;'

Связанный контент