Coloque o comando inteiro entre aspas simples, em vez de duplas.
A primeira coisa a notar é que você tem uma variável (tecla $). Entre aspas duplas, ele será substituído pelo shell antes de torná-lo um argumento dado a su
.
A segunda coisa é sobre a correspondência de cotações que você tem atualmente, com aspas duplas, o argumento será dividido assim:
- 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;
Colocar os argumentos inteiros entre aspas simples permite corrigir os dois problemas, evitar a substituição de variáveis e corrigir a estranheza da divisão, passando essa cadeia como está como o segundo argumento de su
.
Bônus: como uma observação geral, evite colchetes duplos para testes quando possível, é uma base (sintaxe que só funciona com o bash e pode ser substituída por uma parte do contador mais compatível)
A versão a seguir deve funcionar como esperado.
su --command 'read -n 1 -s key; if [ "$key" == "g" ]; then echo "Test Successful."; else echo "Test Failed."; fi;'