vim не може виконати команду unix за допомогою:! за рахунок зміни оболонки


8

Наша компанія використовує систему Linux з червоним капелюхом і розподіляє кожен рахунок в / вдома. На жаль, наша система використовує tsch, що для мене не сприятливо. Більше того, оскільки у мене немає дозволу супер користувача, я не можу використовувати команду chsh, щоб змінити bash для себе. Ще гірше, ypchsh для мене також недоступний. Отже, нарешті, я додаю наступні рядки в .cshrc:

    bash
    echo $0

і відповідним чином налаштувати .bashrc (копіювання з оригіналу .cshrc та виправлення необхідної синтаксичної помилки). Тепер видима оболонка стає bash (як це можна показати з команди "echo $ 0").

Тепер проблема виникає:

Коли я використовую vim для редагування файлу cpp (наприклад, Hello_World) і використовую ":! G ++ -g Hello_World.cpp -o hw.out" in vim для компіляції файлу, результат не буде показаний, і vim закривається з "bash" показано (як коли відкрито термінал), але без звичного "натискання клавіші", щоб повернутися до моєї роботи in vim. У папці Hello_World.cpp є файл .Hello_World.cpp.swp, але не hw.out. Коли vim Hello_World.cpp знову, виявляється, що цей файл cpp був відкритий.

Однак якщо я g ++ файл cpp у папці, але не використовую vim та:!, Все гаразд. Фактично, :! тепер видається незаконним для vim.

Якщо я використовую оригінальний tcsh, все також нормально.

Як я можу виправити цю цікаву помилку?

Заздалегідь дякую за добру допомогу

цин

BTW: Я віддаю перевагу bash перед tcsh насамперед завдяки його зручності HISTIGNORE та HISTCONTROL, хоча tcsh також має налаштування histdup.

Я знайшов наступне трохи корисним, але все ще незадовільним для своєї проблеми.

Як запускати команди Unix з Vim?


Використовуйте chshдля зміни оболонки для входу.
Ярослав Рахматуллін

Відповіді:


8

Помістіть це у свій .login сценарій:

setenv SHELL /bin/bash
exec bash -l

Перший рядок встановлює змінну середовища SHELL. Друга лінія замінює tcshз bash, але каже йому працювати в якості реєстраційної оболонки (так bashбуде обробляти ваші і .profileт.д.). Ви можете додати -iваріант, щоб зробити його інтерактивним; це не повинно бути необхідним.


2
Ви також можете помістити set shell=/bin/bashвсередину VIM. Таким чином, ви можете зберегти свою оболонку, але використовувати BASH у VIM та уникати !проблем. Однак я бачу, що ОП віддає перевагу bash у будь-якому випадку, тому ваше рішення не тільки вирішить проблему VIM, але і надасть OP їх кращу оболонку.
Девід В.

Ти маєш рацію, @DavidW. Оскільки будь-хто може встановити оболонку vim(або vi) на все, що їм заманеться, в принципі неможливо обмежити доступ до системи, якщо ви дозволите користувачеві доступ до viабо vim. У минулі часи люди намагалися встановити оболонку на спеціальну програму, яка виконує лише певні команди. Однак, якщо одна з цих команд viабо vim, то вони мають доступ до системи в будь-якому випадку.
Джонатан Леффлер

Мені шкода, що я, як новачок на цьому веб-сайті, раніше не знаю, як коментувати цю відповідь. Велике спасибі за вашу допомогу. @JonathanLeffler & DavidW
JQK

2

Оболонка за замовчуванням для будь-якого користувача зберігається у файлі / etc / passwd. Користувач може змінити стандартну оболонку на будь-яку з оболонок, перелічених у / etc / shell, видавши chshкоманду. Для отримання додаткової інформації зверніться до сторінок керівництва chsh (1) та оболонок (5).

Ця відповідь є "правильнішою", ніж підхід до заміни поточної оболонки після входу в систему, тому що непотрібно спочатку запускати небажану оболонку. Цей підхід корисний лише тоді, коли адміністратор знехтував файлом / etc / shell і забув до нього додавати bash (ніколи).


Привіт , Пакс, дякую за відповідь. Але я не маю дозволу на виконання команди chsh. Адміністратор також не хоче використовувати chsh для зміни моєї оболонки. Дякую вам все одно.
JQK

1

Дякую за всю велику допомогу.

Перш ніж дати остаточне рішення, яке я вибираю, я маю вказати на помилку в своєму первісному питанні. У мого оригіналу .cshrc є такі три рядки:

     bash
     source ~/.bashrc
     echo $0

Я раніше пропустив друкувати другий рядок. Вибачте.

Тепер я спробував ці два методи, і результати показані нижче.

1) метод .vimrc

Якщо я напишу

     bash
     source ~/.bashrc
     echo $0

в ~ / .cshrc

і

     set shell=/bin/bash

в ~ / .vimrc

без жодного файлу ~ / .login, тоді vim і:! g ++ в порядку, але:! gdb a.out має помилку. Крім того, "echo $ 0" дає "bash", але "echo $ SHELL" дає "/ bin / tcsh". Я не знаю точно різниці між $ 0 і $ SHELL.

2) .логін метод

Якщо я напишу

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

в .login

але нічого подібного до "set shell = ..." в ~ / .vimrc, ні "bash ..." в ~ / .cshrc, все в порядку. Тепер "echo $ 0" дає "bash", а "echo $ SHELL" дає "/ bin / bash".

Баш у другому рядку можна замінити на "bash -l". Слід зазначити, що якщо я заміню його на "exec bash" або "exec bash -l", я не зможу увійти до свого облікового запису. (Система автоматично виходить з ладу.) Я також не знаю, чому.

Я думаю, що другий метод чудовий. Я дуже ціную вашу допомогу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.