1

Я пишу пользовательскую команду запуска для gnome-терминала, и я намерен отображать приветственное сообщение каждый раз, когда я его запускаю.

Сообщение отображается правильно, я его кодировал, чтобы буквы появлялись одна за другой с периодом 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 ответ1

1

Заключите всю команду в одинарные кавычки вместо двойных. Первое, на что нужно обратить внимание, это то, что у вас есть переменная ($ key). Заключенный в двойные кавычки, он будет заменен оболочкой перед тем, как сделать аргумент, заданный su . Второе, что касается кавычек, совпадающих с тем, что у вас есть, с двойными кавычками, аргумент будет разделен следующим образом:

  • arg0: su
  • arg1: --command
  • arg2: read -n 1 -s key; if [ <value of $key or nothing> == g ]; then echo Test
  • arg3: Successful.; else echo Test
  • arg4: не Failed.; fi;

Заключение целых аргументов в одинарные кавычки позволяет решить две проблемы, избежать подстановки переменных и устранить причуду разделения, передавая эту строку как есть как второй аргумент su .

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .