Я пишу специальную команду запуска для 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;'