Introduction
Pensez à un outil comme watch
qui peut prendre une autre commande (par ex. ls -l
) comme suit :
watch ls -l
# or equivalently
watch 'ls -l'
Si la commande est plus compliquée, c'est une question de guillemets/escaping si des choses comme $variable
, *
, |
, ;
o &&
sont interprétées par le Shell actuel ou vont à watch
. Ces deux commandes sont différentes :
watch echo "$$"
watch 'echo "$$"'
Il en va de même pour ces derniers :
watch date ; echo done
watch date \; echo done
ssh
est similaire, il peut prendre un ou plusieurs arguments et construire une commande à exécuter sur le serveur. Il dépend de la mise entre guillemets et de l'échappement si le Shell local interprète $variable
, |
et autres, ou le Shell distant.
Et il y a des commandes comme sh -c
qui nécessitent un seul argument contenant du code, mais le besoin de guillemets/escaping est similaire. En effet, les watch
(ou ssh
) construit cet argument unique pour sh -c
ou une commande similaire.
Problème
J'ai déjà le exactes que je souhaite fournir à watch
o ssh
ou un outil similaire. La commande est obtenue à partir de l'historique ou collée dans la ligne de commande ou tapée comme si elle allait être exécutée directement ; elle se trouve dans ma ligne de commande mot pour mot. Rien dans la commande doit être développée ou interprétée avant d'arriver à watch
ou un outil similaire. En cas de watch
cela signifie que l'expansion et l'interprétation doivent avoir lieu plus tard, périodiquement. En cas de ssh
cela signifie qu'il doit se produire sur le serveur.
Je dois maintenant faire deux choses :
- Ajouter
watch
(ou autre) au début. Ce n'est pas un problème. Je peux le faire en dernier. -
Citez et/ou échappez la commande originale. En général, la commande peut inclure des guillemets simples, de sorte que l'adoption aveugle des guillemets simples n'est pas une solution. Je pense que je connais la bonne solution générale :
- remplacer chaque
'
con'"'"'
ou avec'\''
, - englobe toute la chaîne résultante avec des guillemets simples ;
mais il est fastidieux et source d'erreurs de le faire à la main.
- remplacer chaque
Question
Puis-je faire en sorte que Bash ajoute correctement un niveau de guillemets simples/escaping à l'ensemble de la ligne de commande à la demande ?
(Note : la question s'est posée alors que je répondais aux questions suivantes celui-ci .)