vim không thể thực thi lệnh unix với :! do thay đổi vỏ


8

Công ty chúng tôi sử dụng hệ thống linux mũ đỏ và phân bổ cho mọi người một tài khoản trong / nhà. Thật không may, hệ thống của chúng tôi đang sử dụng tsch, điều này không thuận lợi cho tôi. Hơn nữa, vì tôi không có quyền siêu người dùng, tôi không thể sử dụng lệnh chsh để thay đổi thành bash cho chính mình. Thậm chí tệ hơn, ypchsh cũng không có sẵn cho tôi. Vì vậy, cuối cùng, tôi thêm các dòng sau vào .cshrc:

    bash
    echo $0

và cấu hình .bashrc một cách thích hợp (sao chép từ .cshrc gốc và sửa lỗi cú pháp cần thiết). Bây giờ, vỏ rõ ràng trở thành bash (như có thể được hiển thị từ lệnh "echo $ 0").

Bây giờ vấn đề xuất hiện:

Khi tôi sử dụng vim để chỉnh sửa tệp cpp (ví dụ: Hello_World) và sử dụng ":! G ++ -g Hello_World.cpp -o hw.out" trong vim để biên dịch tệp, sẽ không có kết quả nào được hiển thị và vim bị thoát với "Bash" được hiển thị (như khi một thiết bị đầu cuối được mở), nhưng không có "nhấn phím" thông thường để quay lại công việc của tôi trong vim. Trong thư mục Hello_World.cpp, có tệp .Hello_World.cpp.swp, nhưng không phải hw.out. Khi vim Hello_World.cpp một lần nữa, hóa ra tệp cpp này đã được mở.

Tuy nhiên, nếu tôi g ++ tệp cpp trong thư mục nhưng không sử dụng vim và:!, Mọi thứ đều ổn. Trong thực tế, :! bây giờ dường như là bất hợp pháp cho vim.

Nếu tôi sử dụng tcsh gốc, mọi thứ cũng ổn.

Làm thế nào tôi có thể sửa lỗi tò mò này?

Cảm ơn bạn đã giúp đỡ của bạn trước.

qing

BTW: Tôi thích bash hơn tcsh chủ yếu vì sự tiện lợi của HISTIGNORE và HISTCONTROL, mặc dù tcsh cũng có cài đặt histdup.

Tôi thấy sau đây một chút hữu ích nhưng vẫn không thỏa đáng cho vấn đề của tôi.

Làm thế nào để chạy các lệnh Unix từ bên trong Vim?


Sử dụng chshđể thay đổi vỏ đăng nhập của bạn.
Ярослав Рахматуллин

Câu trả lời:


8

Đặt cái này trong tập lệnh .login của bạn:

setenv SHELL /bin/bash
exec bash -l

Dòng đầu tiên đặt biến môi trường SHELL. Dòng thứ hai thay thế tcshbằng bash, nhưng bảo nó chạy như một vỏ đăng nhập (vì vậy bashsẽ xử lý .profilevv của bạn ). Bạn có thể thêm một -itùy chọn để làm cho nó tương tác; nó không cần thiết


2
Bạn cũng có thể đặt set shell=/bin/bashbên trong VIM. Bằng cách đó, bạn có thể giữ vỏ của mình, nhưng sử dụng BASH trong VIM và tránh các !vấn đề. Tuy nhiên, tôi thấy rằng OP thích bash hơn, vì vậy giải pháp của bạn sẽ không chỉ giải quyết vấn đề VIM, mà còn cung cấp cho OP vỏ ưa thích của họ.
David W.

Bạn nói đúng, @DavidW. Vì bất kỳ ai cũng có thể đặt vỏ của họ trong vim(hoặc vi) thành bất cứ thứ gì họ thích, về cơ bản không thể hạn chế quyền truy cập vào hệ thống nếu bạn cho phép người dùng truy cập vihoặc vim. Trong thời gian qua, mọi người đã cố gắng thiết lập trình bao cho một chương trình đặc biệt chỉ thực hiện một số lệnh nhất định. Tuy nhiên, nếu một trong những lệnh đó là vihoặc vim, thì dù sao họ cũng có quyền truy cập vào hệ thống.
Jonathan Leffler

Tôi cảm thấy tiếc vì tôi là người mới sử dụng trang web này, tôi không biết cách nhận xét về câu trả lời này trước đây. Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn. @JonathanLeffler & DavidW.
JQK

2

Shell mặc định cho bất kỳ người dùng nào được lưu trữ trong tệp / etc / passwd. Người dùng có thể thay đổi shell mặc định của họ thành bất kỳ shell nào được liệt kê trong / etc / shell bằng cách ban hành chshlệnh. Tham khảo các trang hướng dẫn của chsh (1) và shell (5) để biết thêm thông tin.

Câu trả lời này là "chính xác hơn" so với cách tiếp cận thay thế vỏ hiện tại sau khi đăng nhập vì không cần thiết phải bắt đầu vỏ không mong muốn ở vị trí đầu tiên. Cách tiếp cận này chỉ hữu ích khi quản trị viên đã bỏ qua tệp / etc / shells và quên thêm bash vào nó (không bao giờ).


Xin chào Pax, cảm ơn bạn đã trả lời. Nhưng tôi không có quyền thực thi lệnh chsh. Quản trị viên cũng không muốn sử dụng chsh để thay đổi trình bao của tôi. Cảm ơn tất cả các bạn như nhau.
JQK

1

Cảm ơn bạn cho tất cả sự giúp đỡ tuyệt vời của bạn.

Trước khi đưa ra giải pháp cuối cùng tôi chọn, tôi phải chỉ ra một lỗi trong câu hỏi ban đầu của mình. .Cshrc gốc của tôi có ba dòng sau:

     bash
     source ~/.bashrc
     echo $0

Tôi nhớ gõ dòng thứ hai trước. Lấy làm tiếc.

Bây giờ, tôi đã thử hai phương pháp này và kết quả được hiển thị bên dưới.

1) phương thức .vimrc

Nếu tôi viết

     bash
     source ~/.bashrc
     echo $0

trong ~ / .cshrc

     set shell=/bin/bash

trong ~ / .vimrc

không có tập tin ~ / .login nào, thì vim và :! g ++ vẫn ổn, nhưng: gdb a.out có một số lỗi. Hơn nữa, "echo $ 0" cho "bash" nhưng "echo $ SHELL" cho "/ bin / tcsh". Tôi không biết chính xác sự khác biệt giữa $ 0 và $ SHELL.

2) phương pháp .login

Nếu tôi viết

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

trong .login

nhưng không phải bất cứ thứ gì như "set shell = ..." trong ~ / .vimrc cũng không "bash ..." trong ~ / .cshrc, mọi thứ đều ổn. Bây giờ, "echo $ 0" cho "bash" và "echo $ SHELL" cho "/ bin / bash".

Bash trong dòng thứ hai có thể được thay thế bằng "bash -l". Cần lưu ý rằng nếu tôi thay thế nó bằng "exec bash" hoặc "exec bash -l", thì tôi sẽ không thể đăng nhập vào tài khoản của mình. (Hệ thống tự động thoát nhanh.) Tôi cũng không biết tại sao.

Tôi nghĩ rằng phương pháp thứ hai là tuyệt vời. Tối đánh giá rất cao sự giúp đỡ của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.