vim tidak dapat menjalankan perintah unix dengan:! karena perubahan shell

8

Perusahaan kami menggunakan sistem linux red hat dan mengalokasikan setiap orang akun di / rumah. Sayangnya, sistem kami menggunakan tsch, yang tidak menguntungkan bagi saya. Selain itu, karena saya tidak memiliki izin pengguna super, saya tidak dapat menggunakan perintah chsh untuk mengubah ke bash untuk saya sendiri. Lebih buruk lagi, ypchsh juga tidak tersedia untuk saya. Jadi, akhirnya, saya tambahkan baris berikut ke dalam .cshrc:

    bash
    echo $0

dan konfigurasikan .bashrc dengan tepat (menyalin dari .cshrc asli dan memperbaiki kesalahan sintaks yang diperlukan). Sekarang shell tampak menjadi bash (seperti yang dapat ditunjukkan dari perintah "echo $ 0").

Sekarang masalahnya muncul:

Ketika saya menggunakan vim untuk mengedit file cpp (misalnya, Hello_World), dan menggunakan ":! G ++ -g Hello_World.cpp -o hw.out" dalam vim untuk mengkompilasi file, tidak ada hasil yang akan ditampilkan, dan vim keluar dengan "bash" ditampilkan (seperti ketika terminal terbuka), tetapi tanpa biasanya "tekan tombol" untuk kembali ke pekerjaan saya di vim. Di folder Hello_World.cpp, ada file .Hello_World.cpp.swp, tetapi tidak hw.out. Ketika vim Hello_World.cpp lagi, ternyata file cpp ini telah dibuka.

Namun, jika saya g ++ file cpp di folder tetapi tidak menggunakan vim dan:!, Semuanya OK. Faktanya, :! sekarang tampaknya ilegal untuk vim.

Jika saya menggunakan tcsh asli, semuanya juga OK.

Bagaimana saya bisa memperbaiki kesalahan yang aneh ini?

Terima kasih atas bantuannya sebelumnya.

qing

BTW: Saya lebih suka bash ke tcsh terutama karena kenyamanannya dari HISTIGNORE dan HISTCONTROL, meskipun tcsh juga memiliki pengaturan histdup.

Saya menemukan berikut ini sedikit membantu tetapi masih belum memuaskan untuk masalah saya.

Bagaimana menjalankan perintah Unix dari dalam Vim?

JQK
sumber
Gunakan chshuntuk mengubah shell login Anda.
Ярослав Рахматуллин

Jawaban:

8

Masukkan ini ke dalam skrip .login Anda:

setenv SHELL /bin/bash
exec bash -l

Baris pertama mengatur variabel lingkungan SHELL. Baris kedua menggantikan tcshdengan bash, tetapi mengatakannya untuk berjalan sebagai shell login (jadi bashakan memproses Anda .profiledll). Anda dapat menambahkan -iopsi untuk menjadikannya interaktif; seharusnya tidak perlu.

Jonathan Leffler
sumber
2
Anda juga bisa memasukkan set shell=/bin/bashVIM. Dengan begitu, Anda dapat menyimpan shell Anda, tetapi gunakan BASH di VIM dan hindari !masalah. Namun, saya melihat bahwa OP lebih memilih bash, jadi solusi Anda tidak hanya akan menyelesaikan masalah VIM, tetapi juga memberikan OP shell pilihan mereka.
David W.
Anda benar, @vidvidw. Karena siapa pun dapat mengatur shell mereka ke vim(atau vi) apa pun yang mereka suka, pada dasarnya tidak mungkin membatasi akses ke sistem jika Anda mengizinkan pengguna mengakses viatau vim. Di masa lalu, orang telah mencoba mengatur shell ke program khusus yang hanya menjalankan perintah tertentu. Namun, jika salah satu dari perintah itu adalah viatau vim, maka mereka tetap memiliki akses ke sistem.
Jonathan Leffler
Saya merasa menyesal karena saya pemula di situs web ini, saya tidak tahu bagaimana mengomentari jawaban ini sebelumnya. Terima kasih banyak atas bantuan Anda. @JonathanLeffler & DavidW.
JQK
2

Shell default untuk setiap pengguna disimpan di file / etc / passwd. Pengguna dapat mengubah shell default mereka ke salah satu shell yang terdaftar di / etc / shells dengan mengeluarkan chshperintah. Lihat halaman manual chsh (1) dan shells (5) untuk informasi lebih lanjut.

Jawaban ini "lebih benar" daripada pendekatan penggantian shell saat ini setelah masuk karena tidak perlu memulai shell yang tidak diinginkan di tempat pertama. Pendekatan itu hanya berguna ketika administrator telah mengabaikan file / etc / shells dan lupa menambahkan bash padanya (tidak pernah).

Ярослав Рахматуллин
sumber
Hai, Pax, terima kasih atas balasan Anda. Tapi saya tidak punya izin untuk mengeksekusi perintah chsh. Administrator juga tidak ingin menggunakan chsh untuk mengganti shell saya. Terima kasih semua.
JQK
1

Terima kasih atas semua bantuan Anda.

Sebelum memberikan solusi akhir yang saya pilih, saya harus menunjukkan kesalahan dalam pertanyaan awal saya. .Cshrc asli saya memiliki tiga baris berikut:

     bash
     source ~/.bashrc
     echo $0

Saya melewatkan mengetik baris kedua sebelumnya. Maaf.

Sekarang, saya mencoba dua metode ini, dan hasilnya ditunjukkan di bawah ini.

1) .vimrc

Jika saya menulis

     bash
     source ~/.bashrc
     echo $0

di ~ / .cshrc

dan

     set shell=/bin/bash

di ~ / .vimrc

tanpa file ~ / .login, lalu vim dan:! g ++ OK, tetapi:! gdb a.out memiliki beberapa kesalahan. Selanjutnya, "echo $ 0" memberikan "bash" tetapi "echo $ SHELL" memberikan "/ bin / tcsh". Saya tidak tahu persis perbedaan antara $ 0 dan $ SHELL.

2). Metode login

Jika saya menulis

     setenv SHELL /bin/bash
     bash
     source ~/.bashrc
     echo $0

di .login

tetapi tidak ada yang seperti "set shell = ..." di ~ / .vimrc atau "bash ..." di ~ / .cshrc, semuanya baik-baik saja. Sekarang, "echo $ 0" memberikan "bash" dan "echo $ SHELL" memberikan "/ bin / bash".

Bash di baris kedua dapat diganti dengan "bash-l". Perlu dicatat bahwa jika saya menggantinya dengan "exec bash" atau "exec bash-l", maka saya tidak akan dapat masuk ke akun saya. (Sistem secara otomatis berhenti dengan cepat.) Saya juga tidak tahu mengapa.

Saya pikir metode kedua hebat. Saya sangat menghargai bantuan Anda.

JQK
sumber