Ensine um homem a pescar:
Leia atentamente a mensagem de erro e tente descobrir de onde vem
Neste caso, temos:
bash: -c: line 0: unexpected EOF while looking for matching '"'
bash: -c: line 1: syntax error: unexpected end of file
P: Veja o roteiro. Onde temos uma chamada para 'bash' com uma opção -c (comando)?
A: dentro da função as_user (), temos uma chamada:
bash -c "$1"
Agora, $ 1 aqui é o primeiro argumento passado para a função as_user (), então olhamos novamente para o script e encontramos onde as_user () está sendo chamado, e com qual argumento.
Alguns desses argumentos são complexos com 3 níveis de escape / citação, por isso são suspeitos.
Você pode adicionar uma instrução de depuração simples dentro de 'as_user' como a primeira linha antes de qualquer outra coisa ser executada:
echo '$1 is:' $1
O que imprimiria o comando pouco antes da falha e tornaria óbvio qual é o argumento incorreto.
Mais geralmente: você pode convenientemente depurar scripts de shell adicionando rastreio (também conhecido como 'echo'). Basta alterar a primeira linha do script para:
#!/bin/bash -x
e cada comando seria impresso antes de ser executado, tornando óbvia a conexão entre a chamada e o erro. Há também -v (verbose) que irá imprimir todas as linhas à medida que são analisadas , antes de todas as expansões history / command / param / file, mas eu acho -v muito menos útil ao depurar que -x . Em casos raros, uso apenas os dois: -vx para rastrear detalhadamente as expansões que acontecem antes da execução.
HTH