# Commande sh -c indispensable?

**URL:** <https://www.debian-fr.org/t/commande-sh-c-indispensable/88220>\
**Category:** Programmation\
**Created:** [Mai 20, 2023, 1:44 UTC](https://www.debian-fr.org/t/commande-sh-c-indispensable/88220 "2023-05-20T13:44:27Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![zao](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/z/ce7236/32.png) [@zao](https://www.debian-fr.org/u/zao)\
**Post date:** [Mai 20, 2023, 1:44 UTC](https://www.debian-fr.org/t/commande-sh-c-indispensable/88220/1 "2023-05-20T13:44:27Z")

</div>

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

```nohighlight
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 :

```nohighlight
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 .

---

<div class="post-metadata">

**Author:** ![dindoun](https://www.debian-fr.org/user_avatar/www.debian-fr.org/dindoun/32/4281_2.png) [@dindoun](https://www.debian-fr.org/u/dindoun)\
**Post date:** [Mai 20, 2023, 5:00 UTC](https://www.debian-fr.org/t/commande-sh-c-indispensable/88220/2 "2023-05-20T17:00:45Z")

</div>

> [@zao](#):
>
> `xdotool type "adresse-1"`

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

---

<div class="post-metadata">

**Author:** ![zao](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/z/ce7236/32.png) [@zao](https://www.debian-fr.org/u/zao)\
**Post date:** [Mai 20, 2023, 6:25 UTC](https://www.debian-fr.org/t/commande-sh-c-indispensable/88220/3 "2023-05-20T18:25:09Z")

</div>

ç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é .

---

<div class="post-metadata">

**Author:** ![dindoun](https://www.debian-fr.org/user_avatar/www.debian-fr.org/dindoun/32/4281_2.png) [@dindoun](https://www.debian-fr.org/u/dindoun)\
**Post date:** [Mai 21, 2023, 5:43 UTC](https://www.debian-fr.org/t/commande-sh-c-indispensable/88220/4 "2023-05-21T17:43:19Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![zao](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/z/ce7236/32.png) [@zao](https://www.debian-fr.org/u/zao)\
**Post date:** [Mai 21, 2023, 10:16 UTC](https://www.debian-fr.org/t/commande-sh-c-indispensable/88220/5 "2023-05-21T22:16:41Z")

</div>

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 :

```plaintext
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é .

---

<div class="post-metadata">

**Author:** ![Clochette](https://www.debian-fr.org/user_avatar/www.debian-fr.org/clochette/32/8757_2.png) [@Clochette](https://www.debian-fr.org/u/Clochette)\
**Post date:** [Mai 22, 2023, 6:23 UTC](https://www.debian-fr.org/t/commande-sh-c-indispensable/88220/6 "2023-05-22T06:23:21Z")

</div>

> [@zao](#):
>
> 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.

> **[Programmation Bash/Commandes shell — Wikilivres](https://fr.wikibooks.org/wiki/Programmation_Bash/Commandes_shell)**

---

<div class="post-metadata">

**Author:** ![zao](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/z/ce7236/32.png) [@zao](https://www.debian-fr.org/u/zao)\
**Post date:** [Mai 22, 2023, 12:35 UTC](https://www.debian-fr.org/t/commande-sh-c-indispensable/88220/7 "2023-05-22T12:35:05Z")

</div>

> [@Clochette](#):
>
> Tout simplement car _date_ n’est pas une commande 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 .

---

<div class="post-metadata">

**Author:** ![Verner](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/34f0e0/32.png) [@Verner](https://www.debian-fr.org/u/Verner)\
**Post date:** [Mai 22, 2023, 6:07 UTC](https://www.debian-fr.org/t/commande-sh-c-indispensable/88220/8 "2023-05-22T18:07:22Z")

</div>

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.

```auto
$ 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.

```auto
$ 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_).

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

```

Pas de difficulté particulière, ‹&nbsp;$0&nbsp;› é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`

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

```

`$ chmod +x ~/orange.sh`

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

---

<div class="post-metadata">

**Author:** ![zao](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/z/ce7236/32.png) [@zao](https://www.debian-fr.org/u/zao)\
**Post date:** [Mai 22, 2023, 9:56 UTC](https://www.debian-fr.org/t/commande-sh-c-indispensable/88220/9 "2023-05-22T21:56:13Z")

</div>

> [@Verner](#):
>
> 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).

- 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 .

---

<div class="post-metadata">

**Author:** ![Verner](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/34f0e0/32.png) [@Verner](https://www.debian-fr.org/u/Verner)\
**Post date:** [Mai 22, 2023, 10:11 UTC](https://www.debian-fr.org/t/commande-sh-c-indispensable/88220/10 "2023-05-22T22:11:56Z")

</div>

> [@zao](#):
>
> Je voulais éviter le script

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 ‹&nbsp;-c&nbsp;› 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.

---

<div class="post-metadata">

**Author:** ![zao](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/z/ce7236/32.png) [@zao](https://www.debian-fr.org/u/zao)\
**Post date:** [Juin 4, 2023, 2:02 UTC](https://www.debian-fr.org/t/commande-sh-c-indispensable/88220/11 "2023-06-04T14:02:36Z")

</div>

**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 ‹&nbsp;xdotool etc..&nbsp;›** 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](https://abs.traduc.org/abs-5.3-fr/ch04s04.html#childref)) du shell [parent](https://abs.traduc.org/abs-5.3-fr/ch14.html#forkref) 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](https://askubuntu.com/questions/508401/ubuntu-14-04-subshell-and-variable-expansion-in-custom-keyboard-shortcuts)

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 .
