Błąd „nie można ustawić terminala grupy procesów” podczas uruchamiania skryptu bash

13

Mam następujące dwa wiersze kodu w moim pliku init.el:

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

Próbowałem wykonać następujący skrypt, aby uzyskać listę plików wykonywalnych, używając skryptu powłoki dmenu_path.

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

Widzę następujący błąd:

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

Jak mogę zapobiec zwróceniu przez bash tego błędu podczas używania shell-command?

wdkrnls
źródło
Prawdopodobnie częściowe zduplikowane pytanie stackoverflow.com/questions/9670209/... wydaje się, że nie ma jeszcze rozwiązania, jeśli twoja powłoka to bash
Cygwina

Odpowiedzi:

10

Te -iwnioski flag że Bash uruchomić w trybie interaktywnym, który wymaga terminala. Rozwiązaniem jest pozostawienie shell-command-switchzmiennej w jej domyślnej wartości, która jest sprawiedliwa -c.

Jeśli naprawdę trzeba uruchomić Bash w trybie interaktywnym, trzeba będzie uruchomić go w pseudo-terminali, korzystając start-file-processz process-connection-typezwiązany t.

jch
źródło
To nie działało dla mnie.
Didier A.
Mi to pasuje. Jako przykład, polecenie kutery gnome-terminal, biegnie echoi liście sesji bash uruchomiony i gotowy do podjęcia nowych poleceń: (start-file-process-shell-command "peekaboo" "*Messages*" "gnome-terminal -- bash -c 'echo Peekaboo!; bash'"); wszelkie dane wyjściowe polecenia Elisp są wysyłane do *Messages*bufora. Zauważ, że użyłem start-file-process-shell-commandzamiast start-file-process, więc nie muszę podawać ścieżki do programów powłoki.
Arch Stanton
0

Czy dodałeś, -iaby uzyskać bash, aby rozwinąć aliasy? Jeśli tak, jak podano w /programming/12224909 , zamiast tego dołącz

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

w twoich .emacs i

shopt -s expand_aliases

w twoim .bashrc. Pierwszy powoduje, że Twój .bashrc jest uruchamiany na twoich podpowłokach, a drugi pozwala na rozszerzenie aliasu w powłokach bash bez logowania.

Możesz przejść o jeden lepszy, tworząc oddzielny skrypt powłoki z aliasami i linią shopt i używając go jako wartości BASH_ENV; które mogą działać szybciej niż pełne ~ / .bashrc.

Ethan Bradford
źródło
Czy możesz streścić opisaną tam poprawkę? W przeciwnym razie jest to zasadniczo odpowiedź tylko do łącza, więc istnieje ryzyko, że zostanie usunięta.
Drew