Commande sh -c indispensable?

système Debian 11 + Xfce

bonjour ,

j’essaie de mettre au point une commande qui puisse être associée à un raccourci clavier pour insérer automatiquement une adresse courriel dans un document .

  • étape 1 : la commande
mm@ldlc:~$ xdotool type "adresse-1@orange.fr"
adresse-1@orange.fr
  • étape 2 : le raccourci

impossible ( ou je ne sais pas faire ) d’en faire un qui fonctionne avec cette commande . Il m’a fallu rajouter 2 commandes supplémentaires : sleep et sh -c . Donc au final :

mm@ldlc:~$ sh -c 'sleep 0.5 ; xdotool type "adresse-1"'

associée au raccourci Maj + F1 fonctionne correctement .

question : pourquoi la commande sh -c , qui ouvre un sous-shell si j’ai bien compris , est-elle indispensable pour écrire dans un fichier quelconque à partir d’un raccourci clavier et ne l’est pas pour écrire cette adresse sur un écran de terminal ?

Edit : en fait sans raccourci clavier je n’ai pas besoin de sh -c , la redirection stdout > fichier fonctionne bien .

même chose sous cinnamon; pas d’explication.

ça me rassure , je ne dois pas avoir fait de grosse boulette . En remplaçant sh par bash ça marche aussi , par contre l’otion -c a tout l’air d’être indispensable car bash seul ne marche pas et pourtant il me semble bien qu’il ouvre un sous shell lui aussi . Malheureusement je ne comprends pas ce que fait cette option -c :

-c : Read commands from the command_string operand instead
of from the standard input. Special parameter 0 will
be set from the command_name operand and the posi‐
tional parameters ($1, $2, etc.) set from the remain‐
ing argument operands.

bah ! tant pis , le principal est que je tiens ma commande , même si j’aurais préféré la comprendre .

merci pour la réponse .

Edit : je viens de lire un commentaire sur stackexchange qui éclaire l’affaire de l’option -c : elle permet de lire puis d’exécuter la commande , sh -c ou bash -c je suppose , en tenant compte de l’ensemble de la chaîne entre les deux ’ ’ . Ça ne me renseigne toujours pas sur sa nécessité .

j’ai essayé des dizaines de trucs ( . /tmp/a.sh ; sh /tmp/a.sh; sh -c /tmp/a.sh ; sh -c « /tmp/a.sh » ; sh -c " . /tmp/a.sh" ; sh -c « sh /tmp/a.sh » ; chown root.root /tmp/a.sh ; chmod u+s /tmp/a.sh; ) mais seul le tien marche

le mien c’est beaucoup dire , car le mien était la 1ère commande , la 2ème mouture je l’ai trouvée sur la toile car apparemment je n’étais pas le seul à rencontrer ce problème . Je me demande ce que le programme ou le script ou je ne sais quoi à qui on fournit la commande pour générer un raccourci l’interprète à la façon de bash ou s’il a sa manière à lui de la traiter . Les résultats étant différents entre terminal et création du raccourci le traitement de la commande fournie n’est probablement pas le même ., mais je n’ai trouvé aucune explication à ce sujet , juste ceci qui pourrait peut-être s’appliquer à ce cas :

the commands run by keyboard bindings are not parsed via a shell.

Et il y a une autre curiosité , du moins je trouve :

mm@ldlc:~$ bash date
/usr/bin/date: /usr/bin/date : ne peut exécuter le fichier binaire
mm@ldlc:~$ date
dim. 21 mai 2023 14:36:32 CEST
mm@ldlc:~$ bash -c date
dim. 21 mai 2023 14:36:45 CEST

sans l’option -c bash ne peut pas exécuter une commande , cf bash date , or un terminal bash les exécute bien donc logiquement un terminal exécute bash -c , comme avec la commande date ci-dessus . Malheureusement cette petite démonstration semble buter sur la commande xdotool … du 1er post … à moins que ce qui crée le raccourci ne fonctionne pas comme bash comme déjà suggéré . Donc je n’ai en rien avancé .

Tout simplement car date n’est pas une commande shell, c’est un binaire qui est appelé.
Si maintenant tu demande expressément à Bash de lancer un binaire (une commande) il va y arriver, sinon il te l’explique clairement.

https://fr.wikibooks.org/wiki/Programmation_Bash/Commandes_shell

je pense que tu veux parler d’une primitive du shell ( builtin ) qui s’exécute sans appeler de programme ?

De toute façon pour tirer ma conclusion erronée je m’étais basée sur l’essai de 2 commandes : date et ls qui ne sont ni l’une ni l’autre des builtins ( bash ) . Au temps pour moi . De plus 2 essais pour une généralisation c’est vraiment court ; trèscourt .

Une autre chose curieuse à propos de ces raccourcis clavier : dans mon cas des commandes comme echo ou printf auraient été plus simples mais là encore ça ne marche pas , même enveloppées dans sh -c ‹ xxx › , impossible de fabriquer le raccourci .

Un peu de débroussaillage n’est peut-être pas inutile…

■ sh / bash

sh est par défaut un raccourci vers dash, qui est un shell léger, minimaliste, peu gourmand en mémoire. La syntaxe de dash est moins puissante que celle de bash ou zsh, mais très largement suffisante au niveau système, où bash est inutile.

$ readlink /bin/sh
dash

Dans un terminal déjà ouvert, un process bash est déjà en cours avec ses paramètres et options d’environnement. Il suffit donc d’exécuter directement les commandes.

$ J=hier ; echo "$0 - $J"
bash - hier

Lorsqu’une ou plusieurs commandes doivent être lancées dans un nouveau process bash ou sh indépendant, l’option -c permet de le faire, conformément au manuel (qui peut parfois paraître plus compliqué que nécessaire).

$ sh -c 'J=demain ; echo $0 ; echo $J'
sh
demain

Pas de difficulté particulière, ‹ $0 › étant le nom du process en cours.

■ Raccourci clavier pour insérer automatiquement une adresse courriel dans un document.
Pour des raisons de fiabilité, et facilité de test, il est préférable de placer les commandes à exécuter dans un script, plutôt que de tenter de saisir une liste de commandes dans un interface graphique pour faire le raccourci (comportement constaté plus aléatoire, moins maîtrisable).

création de ~/orange.sh

#!/bin/sh
xdotool type 'adresse-1@orange.fr '

$ chmod +x ~/orange.sh

→ Affectation d’un raccourci clavier à la commande ‹ sh ~/orange.sh › :
→ pas de problème dans KDE.

  • Je voulais éviter le script car je trouvais plus immédiate la solution interface graphique . J’ai donc écrit le script proposé en modifiant légèrement la commande à laquelle j’ai dû ajouter un temps mort de 0.5s sinon la sortie est tronquée

  • J’ai quand même utilisé l’interface graphique pour lier un raccourci clavier au script , j’essaierai de passer par une commande ( bind peut-être ? ) plus tard .

  • même avec un script les commandes echo et printf ne s’associent pas à un raccourci clavier . L’exécution du script avec ces commandes affiche bien le texte demandé sur l’écran d’un terminal mais pas dans un document ( simulé par un fichier Mousepad ) .

merci pour le coup de main .

Certes, mais si je fais la remarque, c’est qu’en faisant des tests en cumulant plusieurs raccourcis différents sur des commandes très proches, mais différentes, j’ai eu des effets étranges liés à la tripatouillerie de l’interface graphique qui peut se mélanger les pinceaux (pas toujours très clair par derrière, selon l’environnement, gestion de cache mémoire etc…).
Donc, pour celui qui rencontre des choses bizarres, je donne la solution au moins pour clarifier, lever un doute.

En résumé, si le raccourci fonctionne, que la différence entre sh et bash est clarifiée, et que l’option ‹ -c › est comprise, si tout ce que tu as demandé fonctionne, pourquoi maintenant encore rajouter des complications avec bind ? echo ? printf ?
Quel est ton réel objectif (pour celui qui souhaiterait poursuivre).
Bon courage.

Note : Afin de ramasser en un seul endroit les résultats de mes recherches sur le sujet je me sers de ce dernier message , j’espère que ça ne pose pas de problème ?

Comme je n’aime pas rester sur un échec j’ai repris cette déjà un peu ancienne histoire .

J’entrevois un début d’explication sur le fait qu’un script permet la création d’un raccourci clavier en utilisant une commande qui ne fonctionne pas si on la rentre directement dans la fenêtre commande proposée par Xfce .

  • si je n’ai pas utilisé chmod u+x le script reste un simple fichier dont on peut exécuter le contenu avec bash script ou sh script , on ouvre alors un processus fils qui réalise l’exécution de la commande

  • la commande sh -c ‹ xdotool etc… › fait la même chose : sh ouvre un processus fils et -c lui dit d’exécuter ce qui se trouve entre ’ et ’ soit la même commande que celle du script .

Sensé ou billevesée ?

Reste à comprendre pourquoi un processus fils est nécessaire pour que cette commande permette la création d’un raccourci .

  • ps 1 : processus fils ou shell fils ou sous-shell ( subshell ) ???

  • ps 2 :

Exécuter un script shell lance un nouveau processus, un sous-shell .
Chaque script shell en cours d’exécution est un sous-processus (processus enfant) du shell parent shell.

pas très clair , mais Eric Sanchis parle de shell fils créé par la commande bash pour exécuter un script

$bash => création d’un shell bash, fils de l’interpréteur précédent,

  • ps 3 : serait-ce un problème d’accès aux variables d’environnement par le programme qui gère la fenêtre commande de Xfce ? En tout cas il ne doit pas fonctionner comme bash car il n’a pas l’air de connaître les commandes primitives du shell comme export par exemple ( testé avec export PATH=).
    ubuntu

Essayé /usr/bin/xdotool : ne fonctionne pas non plus . Donc le fait de ne pas avoir accès à PATH n’est pas suffisant .

  • ps 4 : épilogue
    comme 2 réponses extérieures me disent que le programme qui gère la commande s’exécute en dehors de toute forme de shell il peut être nécessaire d’en créer un pour pouvoir interpréter correctement la commande proposée , surtout si elle est un peu complexe : c’est ce que font le script et la commande sh -c . J’achète même s’il reste des zones d’ombre . Possiblement résolu par une aide extérieure donc .