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
?
shell-command
bash
wdkrnls
źródło
źródło
Odpowiedzi:
Te
-i
wnioski flag że Bash uruchomić w trybie interaktywnym, który wymaga terminala. Rozwiązaniem jest pozostawienieshell-command-switch
zmiennej 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-process
zprocess-connection-type
związanyt
.źródło
gnome-terminal
, biegnieecho
i 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łemstart-file-process-shell-command
zamiaststart-file-process
, więc nie muszę podawać ścieżki do programów powłoki.Czy dodałeś,
-i
aby uzyskać bash, aby rozwinąć aliasy? Jeśli tak, jak podano w /programming/12224909 , zamiast tego dołączw twoich .emacs i
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.
źródło