Perintah apa pun di terminal saya yang keluar dengan kode bukan nol menutup jendela terminal saya

22

Awalnya ini agak lucu, seperti bermain "Bash Roulette" ... tapi sekarang sudah semakin tua lol

Perintah apa pun di terminal saya yang keluar dengan kode bukan nol menutup jendela terminal saya

Saya diberitahu bahwa mungkin saya telah set -emengatur beberapa bash script di suatu tempat yang sumber terminal saya.

Saya telah memeriksa .bash_profile/ .bashrc/ .profiledan sepertinya tidak set -eada di sana.

Apakah akan ada pelakunya yang jelas?

Alexander Mills
sumber
7
Jalankan a set +e, apakah itu memperbaiki masalah? Jika demikian, yang saya asumsikan, maka Anda harus terus mencari itu set -e. Itu bisa dalam versi global file-file ini di bawah /etc, atau dalam skrip lain yang bersumber dari mereka. Pindahkan file konfigurasi Anda, jika masalahnya sudah diperbaiki kemudian tambahkan kembali baris dalam potongan yang lebih kecil untuk melihat di mana ia rusak.
egmont
3
PS4=' ${BASH_SOURCE}:$LINENO: ' bash -lixc true |& grep -e set -e trapbisa informatif.
muru
Anda dapat memeriksa set bendera shell saat ini diaktifkan dengan variabel khusus -seperti: echo $-.
David Foerster

Jawaban:

21

Baiklah, memang benar, itu bandel set -eyang menyebabkan masalah saya.

Cara saya menemukan set -emenggunakanbash -lx

Hal terbaik untuk dilakukan adalah menggunakan:

bash -lx > lx.log 2>&1

kemudian buka file log itu dan lakukan pencarian untuk set...

setelah Anda menemukan jalan yang salah set -eAnda dapat menghapus garis itu dan masalah Anda harus hilang! (Mesin restart mungkin ide yang bagus untukmu).

Dalam kasus saya, file set -etersebut ada dalam file yang .bash_profile sumber, tetapi barisnya tidak ada di .bash_profile itu sendiri.

Alexander Mills
sumber
3
Hal-hal yang aman sourcedi shell Anda adalah kumpulan yang jauh lebih kecil dari sekadar "script shell acak". -edapat berguna dalam skrip aktual, untuk memeriksa kesalahan bodoh. (Atau untuk memastikan Anda tidak lupa memeriksa kesalahan apa pun.)
Peter Cordes
Rupanya itu terjadi ... saya berharap ada sesuatu seperti global set -esehingga set -ehanya mempengaruhi script yang mengandung
Alexander Mills
@AlexanderMills, untuk melakukan itu, Anda dapat memeriksa $-untuk memeriksa bendera di skrip dalam dan mengembalikan
kondisinya
Jadi saya kira local set -ehanya bisa digunakan dalam fungsi bash?
Alexander Mills
13

Jika Anda hanya ingin menyelesaikan masalah, sertakan - set +eAnda .bashrcdi akhir.

Anda bisa menggali — ada banyak tempat lain di mana set -emungkin berada — tetapi itu akan mengurus semuanya.

Namun, jika itu set -eadalah bagian dari Anda $PROMPT_COMMANDmaka hal di atas tidak akan berfungsi. Coba printf '%s\n' "$PROMPT_COMMAND"dan lihat apa isinya.

Wildcard
sumber
pada mesin saya, ketika saya membuka terminal, printf '%s\n' "$PROMPT_COMMAND"menghasilkan hanya ruang kosong, tidak ada di sana
Alexander Mills
@AlexanderMills, maka bukan itu masalah Anda. Salah satu kegunaan umum $PROMPT_COMMANDadalah untuk memperbarui nama tab terminal atau nama jendela; MacOS X dan Ubuntu melakukan keduanya. Lihat apple.stackexchange.com/q/220641/151730 untuk data tentang ini untuk Mac.
Wildcard
Saya menemukan jawaban untuk masalah ini dan menambahkan jawaban saya sendiri, set +etidak bekerja, mungkin karena itu sebelum para set -epanggilan dalam file pesta bersumber saya.
Alexander Mills
1
@AlexanderMills, ya, saya pikir itu tersirat. Saya bermaksud menambahkan set +e ke Anda .bashrc, bukan memasukkannya di awal. Saya telah membuat itu secara eksplisit dalam jawaban saya sekarang. Bagusnya Anda menemukan sumbernya!
Wildcard
Ya, set +eitu hanyalah bantuan band, tapi Anda menyatakan bahwa
Alexander Mills