A saída do comando acima quando passado por echo é:
# echo systemctl\ {restart,status}\ sshd\;
systemctl restart sshd; systemctl status sshd;
Mesmo se eu colar a saída no terminal, o comando funcionará. Mas quando tento executar o comando diretamente, recebo:
# systemctl\ {restart,status}\ sshd\;
bash: systemctl restart sshd;: command not found...
Eu tenho duas perguntas..
- Como exatamente é chamado esse método de substituição e expansão? (Para que eu possa pesquisar e aprender mais sobre ele e como usá-lo corretamente).
- O que eu fiz de errado aqui? Por que não funciona?
É uma forma de expansão Brace feita no shell. A ideia da expansão do colete está correta, mas a forma como foi usada está incorreta aqui. Quando você pretendia fazer:
O shell interpreta
systemctl restart sshd;
como um comando longo e tenta executá-lo, mas não conseguiu localizar um binário para executá-lo dessa maneira. Porque neste estágio, o shell tenta tokenizar os itens na linha de comando antes de construir o comando completo com argumentos - mas isso ainda não aconteceu.Para esses valores de expansão conhecidos, você pode usar
eval
e ainda estar seguro, mas certifique-se do que está tentando expandir com ele.Mas eu prefiro usar um loop em vez
for
de , em vez de tentar escrever uma linha ou usareval
:Isso é chamado de expansão de colchetes (como a etiqueta indica).
Considere os estágios envolvidos na leitura e execução de uma linha de comando no bash (por exemplo):
O que você está tentando fazer é afetar (2) de (3). A divisão baseada em
;
está no estágio (2), quando está analisando comandos compostos. No momento em que (3) está acontecendo para expansão de chaves, já é tarde demais para tentar criar um comando composto.a primeira linha
expandir como 3 token
então echo echo os dois últimos tokens, e parece OK.
da mesma forma a segunda linha
expande como 2 tokens
e o bash tenta procurar um executável
systemctl restart sshd;
que não conseguiu encontrar.Você pode querer começar sua jornada no lado negro usando
eval systemctl\ {restart,status}\ sshd\;
cuidado com o inesperado.