Erreur «impossible de définir le groupe de processus du terminal» lors de l'exécution du script bash

13

J'ai les deux lignes de code suivantes dans mon fichier init.el:

(setq shell-file-name "bash")
(setq shell-command-switch "-ic")

J'ai essayé d'exécuter le script suivant pour obtenir une liste d'exécutables à l'aide du script shell dmenu_path.

(defun dmenu-path-out ()
  (shell-command-to-string "dmenu_path"))

Je vois l'erreur suivante:

bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
[
0ad
...

Comment puis-je empêcher bash de renvoyer cette erreur lors de l'utilisation shell-command?

wdkrnls
la source
Question en double peut-être partielle de stackoverflow.com/questions/9670209/… il ne semble pas encore y avoir de solution si votre shell est bash de cygwin
julio

Réponses:

10

L' -iindicateur demande que Bash s'exécute en mode interactif, ce qui nécessite un terminal. La solution est de laisser la shell-command-switchvariable à sa valeur par défaut, qui est juste -c.

Si vous avez vraiment besoin d'exécuter Bash en mode interactif, vous devrez l'exécuter dans un pseudo-terminal, en utilisant start-file-processavec process-connection-typelié à t.

jch
la source
Ça n'a pas marché pour moi.
Didier A.
Ça marche pour moi. Par exemple, cette commande lance gnome-terminal, exécute echoet laisse la session Bash en cours d'exécution et prête à accepter de nouvelles commandes (start-file-process-shell-command "peekaboo" "*Messages*" "gnome-terminal -- bash -c 'echo Peekaboo!; bash'"):; toute sortie de la commande Elisp est envoyée au *Messages*tampon. Notez que j'ai utilisé à la start-file-process-shell-commandplace de start-file-process, donc je n'ai pas besoin de donner le chemin aux programmes shell.
Arch Stanton
0

Avez-vous ajouté -ipour que bash développe des alias? Si oui, comme indiqué dans /programming/12224909 , incluez plutôt

(setenv "BASH_ENV" "~/.bashrc")

dans votre .emacs et

shopt -s expand_aliases

dans votre .bashrc. Le premier entraîne l'exécution de votre .bashrc sur vos sous-shells, et le second permet l'expansion d'alias dans les shells bash sans connexion.

Vous pouvez faire mieux en créant un script shell séparé avec vos alias et la ligne shopt, et en l'utilisant comme valeur BASH_ENV; qui peut s'exécuter plus rapidement que votre ~ / .bashrc complet.

Ethan Bradford
la source
Pouvez-vous résumer le correctif détaillé ici? Sinon, il s'agit essentiellement d'une réponse uniquement liée à un lien et risque donc d'être supprimée.
Drew