Apakah bash memiliki kaitan untuk menentukan kapan shell anak keluar?

7

Di bashI berputar t/cshshell, yang memperbarui input tty ( stty erase ^H) di .cshrc, tetapi ketika exit-ing dan kembali ke bash backspacekunci tidak lagi berfungsi. Ini karena bash menggunakan readlinedan saya perlu mengatur ulang erase ( stty erase ^?).

Jika saya mengerti trapdengan benar, sepertinya saya bisa menjebak t / csh keluar dari dalam proses t / csh, dan menjalankan perintah setelah keluar. Namun, preferensi saya adalah agar trapping terjadi di bash, yang idealnya mendeteksi shell dipanggil / keluar dan kemudian menjalankan skrip untuk mengatur ulang konfigurasinya.

Ini lebih disukai karena saya bisa memanggil sejumlah kerang (misalnya dash,, zsh), yang mungkin secara tidak sengaja mengubah pengaturan spesifik-bash. Daripada mempertahankan beberapa trapperintah untuk setiap shell, sepertinya akan lebih baik jika memiliki satu untuk bash.


Apakah pemahaman saya trapbenar? Jika demikian, apakah mungkin untuk bashmendeteksi keluar shell anak dan kemudian menjalankan skrip?

vol7ron
sumber

Jawaban:

7

Anda berada di jalur yang benar dengan trap. Yang Anda inginkan adalah sebagai berikut:

trap "stty erase ^?" SIGCHLD

Anda dapat menambahkannya ke .bashrc. Catatan bahwa ini akan berjalan ketika setiap subprocess berakhir.

Ini hanya akan berfungsi dalam sesi interaktif. Untuk sesi non-interaktif, bash tidak akan mengaktifkan kontrol pekerjaan secara default, jadi Anda harus menjalankannya set -o monitorterlebih dahulu. Tapi saya ragu Anda perlu backspaces dalam skrip non-interaktif.

SIGCHLD dikirim ke proses induk setiap kali subproses keluar.


Metode alternatif adalah membungkus shell Anda yang lain dalam sebuah skrip, seperti:

#!/bin/sh
tcsh
stty erase ^?

Kemudian, jika Anda meluncurkan shell Anda melalui skrip, skrip akan menjalankan stty eraseperintah setelah shell keluar. Ini cenderung memiliki efek samping daripada trappenangan global , tetapi tentu saja itu hanya akan berfungsi jika Anda membuka skrip setiap kali (atau membuat alias untuk melakukannya, misalnya alias 'tcsh' '~/launch-tcsh.sh').

Floofy Fox
sumber
Saya kira untuk pengaturan tty, pekerjaan / kontrol bukanlah masalah besar, tetapi segala sesuatu yang mungkin merupakan poin yang sangat penting. Dugaan saya adalah ada cara untuk mendeteksi proses anak dan hanya melakukan jebakan ini jika itu adalah shell yang berbeda, tapi inilah yang saya harapkan - saya skeptis, tapi saya senang saya bertanya - terima kasih!
vol7ron
@ vol7ron Sayangnya, tidak ada cara yang sangat mudah untuk mendeteksi apa proses anak itu, dari bash. Anda dapat menggunakan jobs -nuntuk mendapatkan pekerjaan yang baru keluar dan mudah-mudahan yang terakhir benar, tetapi ada kondisi lomba di sana. Saya pikir Anda mungkin lebih baik menggunakan alternatif pembungkus skrip sebagai gantinya.
Floofy Fox
1
Saya akan berpikir bahwa cara termudah untuk memasukkan ^?adalah mengetik ^karakter kemudian ?karakter: sttymemahami bahwa ^karakter adalah awalan untuk karakter kontrol. Juga, Anda bisa menggunakan Control-V Backspaceuntuk memberi tahu Vim bahwa Anda ingin menyisipkan karakter Backspace literal.
Adrian Pronk
@AdrianPronk Terima kasih, tidak tahu sttymelakukannya. Apakah vim literal bekerja pada satu titik tetapi kemudian memasukkan sesuatu. Pokoknya diedit.
Floofy Fox