Estou tentando criar um script de um pequeno utilitário para começar meu dia com mais facilidade com uma janela tmux personalizada. Minha variável não parece ser avaliada antes que o tmux envie suas chaves, no entanto:
#!/bin/bash
MY_WORKSPACE=/users/me/someproject
tmux send-keys 'cd ${MY_WORKSPACE}' 'C-m'
está cometendo um cd ${MY_WORKSPACE}
erro porque MY_WORKSPACE não foi substituído pelo conteúdo da variável.
MY_WORKSPACE
é definido no script, mas (provavelmente) não no shell que recebe as chaves que você envia viatmux send-keys
. A variável está entre aspas simples no script, portanto não é expandida. O shell no tmux ficacd ${MY_WORKSPACE}
literalmente, como se você o tivesse digitado. A variável indefinida é expandida para nada.Você precisa colocar aspas duplas na string no script, para que a variável seja expandida lá. Seu conteúdo será digitado no shell no tmux. Em seguida, será interpretado .
No seu caso, a variável se expande para
/users/me/someproject
. Esta string não contém espaços nem outros caracteres problemáticos. A solução desta outra resposta funcionará com esta string. É como:Em geral , esse código é ruim. Você deve pelo menos colocar aspas simples no conteúdo expandido:
(Usei o nome em minúsculas para a variável porque é uma boa prática .) O shell de destino receberá o conteúdo da variável expandida entre aspas simples. Isso impedirá a divisão de palavras, globbing e expansão adicional de
$
(se houver), etc. Ainda assim, aspas simples literais no conteúdo da variável podem interromper o comando e até mesmo injetar comandos arbitrários. Existem maneiras de evitar isso. O próprio Bash fornece uma solução conveniente:${my_workspace@Q}
expande para uma string que recria a string original como uma palavra ao ser interpretada. Você nem precisa de aspas simples adicionais, elas serão adicionadas durante a expansão variável.Coloque entre aspas duplas: "cd $MY_WORKSPACE"...