Estou usando este método para abrir uma janela de terminal do Gnome e executar comando(s) - neste caso, para me enviar mensagens de notificação simples (serão agendadas via at
):
#!/bin/sh
gnome-terminal -- /bin/sh -c 'echo "remember: $1"; exec bash'
O shell imprime apenas a remember:
string e não o valor especificado, por exemplo, ao executar remind.sh "pick up the package"
ou remind.sh "buy groceries X and Y"
.
Quando eu retiro o script para o seu núcleo, tudo funciona como esperado (é claro que não terá nenhum uso na automação via cron ou systemd, pois nada é exibido em primeiro plano):
#!/bin/sh
echo "remember: $1"
Análise
O código que você (ou melhor
gnome-terminal
, no seu caso) fornece/bin/sh -c
verá os parâmetros posicionais fornecidos após o código. Por exemplo, estevai imprimir
remember: first
.Não fornecer nada após o código fazer com que
$1
(ou$2
,$3
etc.) se expanda para uma string vazia quando o código for finalmente interpretado ($0
é um pouco diferente, mas isso não importa aqui). Esta é a razão que você temremember:
./bin/sh
run bygnome-terminal
simplesmente não sabe nada sobre os parâmetros posicionais do script principal, a menos que você os passe explicitamente.Solução
Para preencher parâmetros posicionais do código interno com parâmetros posicionais do script, use
"$@"
em vez defirst second …
:Você pode passar o que quiser. Aqui passamos todos os parâmetros (
"$@"
expande para todos os parâmetros posicionais), mas em geral você pode usar"$1"
(se quiser que o código interno conheça apenas o primeiro parâmetro ) ou"$2"
(se quiser que o código interno veja o segundo parâmetro posicional do script principal como seu próprio$1
).Notas
sh
como o argumento zero é explicado aqui: Qual é o segundo sh insh -c 'some shell code' sh
?Se em seu script original (ou seja, sem minha correção) o código do shell que você pretende fornecer estiver
sh -c
entre aspas duplas, o shell interpretado o script expandirá$1
e incorporará o resultado no código interno. Mas não faça isso.Em muitos casos, isso funcionaria como esperado; mas não em geral. Em geral, é tão falho quanto a incorporação
{}
. O código entre aspas simples e os argumentos depois dele são o caminho certo.Aspas simples no código garantem que ele ficará
/bin/sh -c
como está ( as aspas duplas internas não importam ). Entãosh
verá o código comoe é muito bom você ter colocado aspas duplas
$1
aqui.