Normalmente, para perguntas como essa, a resposta é ler BashFAQ # 50: "Estou tentando colocar um comando em uma variável , mas os casos complexos sempre falham! ". Resumo: as variáveis são para dados, não para códigos executáveis, e tentar colocar códigos nelas tem todos os tipos de problemas.
Mas, neste caso, há outro fator crítico: você vai executar o comando via ssh
, o que significa que ele será passado para o sistema remoto como dados , e analisado como um comando por um shell no computador remoto. Isso significa que é razoável armazenar o comando (como dados) em uma variável no script (no computador local).
Parece-me que o maior problema que você está tendo é que quando você usa backquotes ou $( )
(e eles não estão entre aspas simples), o comando dentro é executado imediatamente (no computador local), e sua saída fica armazenada na variável. Para evitar isso, você pode escapar dos caracteres relevantes ao definir a variável:
RM_CMD="rm -rf \$(ls -t '${FOLDER}/other_folder' | awk 'NR>5')"
Note que usei $( )
em vez de backquotes, pois é geralmente preferido. Parece-me que você confundiu aspas com aspas simples em alguns pontos; eles parecem semelhantes, mas têm efeitos completamente diferentes. $( )
faz essencialmente a mesma coisa, mas não é visualmente ambíguo.
Além disso, suponho que ${FOLDER}
seja uma variável no computador local, portanto, isso precisa ser expandido imediatamente (e eu adicionei aspas simples ao redor, caso elas contenham espaços ou outros metacaracteres de shell); se for expandido pelo shell remoto, use \"\${FOLDER|/other_folder\"
. Na verdade, colocar aspas simples em torno de ${FOLDER}
não funcionará se contiver as própriaspas simples. Há uma maneira de consertar isso, mas não me incomodei aqui.
Você também pode usar aspas simples na atribuição de variável, mas, em seguida, teria problemas com as aspas simples no comando awk
(não há uma maneira simples de aninhar aspas simples em uma cadeia de aspas simples ) e não há uma maneira limpa de expandir ${FOLDER}
no computador local. Estes são solúveis com citações mistas, mas é confuso.
Finalmente, quando você usa a variável, você deve colocá-la entre aspas duplas:
ssh -t user@server "$RM_CMD"
... isso não deve importar neste caso em particular, mas existem todos os tipos de coisas que podem dar errado com referências a variáveis sem aspas duplas, então geralmente é uma boa prática citá-las duas vezes