Saya memiliki dua baris kode berikut di file init.el saya:
(setq shell-file-name "bash")
(setq shell-command-switch "-ic")
Saya mencoba menjalankan skrip berikut untuk mendapatkan daftar executable menggunakan skrip shell dmenu_path.
(defun dmenu-path-out ()
(shell-command-to-string "dmenu_path"))
Saya melihat kesalahan berikut:
bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
[
0ad
...
Bagaimana saya bisa mencegah bash mengembalikan kesalahan itu saat menggunakan shell-command
?
shell-command
bash
wdkrnls
sumber
sumber
Jawaban:
The
-i
permintaan bendera yang Bash berjalan dalam modus interaktif, yang membutuhkan terminal. Solusinya adalah meninggalkanshell-command-switch
variabel pada nilai standarnya, yaitu adil-c
.Jika Anda benar-benar perlu menjalankan Bash dalam mode interaktif, Anda harus menjalankannya di pseudo-terminal, dengan menggunakan
start-file-process
denganprocess-connection-type
terikatt
.sumber
gnome-terminal
, berjalanecho
dan daun sesi Bash berjalan dan siap untuk mengambil perintah baru:(start-file-process-shell-command "peekaboo" "*Messages*" "gnome-terminal -- bash -c 'echo Peekaboo!; bash'")
; setiap output dari perintah Elisp dikirim ke*Messages*
buffer. Perhatikan bahwa saya menggunakanstart-file-process-shell-command
bukanstart-file-process
, jadi saya tidak perlu memberikan path ke program shell.Apakah Anda menambahkan
-i
untuk mendapatkan bash untuk memperluas alias? Jika demikian, seperti yang diberikan dalam /programming/12224909 , alih-alih sertakandi .emacs Anda dan
di .bashrc Anda. Yang pertama menyebabkan .bashrc Anda dijalankan pada sub-shell Anda, dan yang terakhir memungkinkan ekspansi alias di shell bash non-login.
Anda dapat melakukannya dengan lebih baik dengan membuat skrip shell terpisah dengan alias dan baris shopt Anda, dan menggunakannya sebagai nilai BASH_ENV; yang mungkin berjalan lebih cepat daripada ~ ~ .bashrc penuh Anda.
sumber