vim не может выполнить команду unix с:! из-за смены оболочки

8

Наша компания использует систему Red Hat Linux и выделяет каждому аккаунт в / home. К сожалению, наша система использует 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» в vim для компиляции файла, результат не будет отображаться, и vim завершается с отображается bash (например, когда терминал открыт), но без обычного нажатия клавиши, чтобы вернуться к моей работе в vim. В папке Hello_World.cpp есть файл .Hello_World.cpp.swp, но не hw.out. Когда vim Hello_World.cpp снова, оказывается, что этот файл cpp был открыт.

Тем не менее, если я g ++ файл cpp в папке, но не использую vim и:!, Все в порядке. По факту, :! теперь кажется незаконным для VIM.

Если я использую оригинальный tcsh, все также в порядке.

Как я могу исправить эту любопытную ошибку?

Спасибо за вашу помощь заранее.

цин

Кстати: я предпочитаю bash tcsh в первую очередь из-за удобства HISTIGNORE и HISTCONTROL, хотя tcsh также имеет настройку Histdup.

Я нашел следующее немного полезным, но все еще не удовлетворяющим моей проблеме.

Как запускать команды Unix из Vim?

JQK
источник
Используйте, chshчтобы изменить вашу регистрационную оболочку.
Ярослав Рахматуллин

Ответы:

8

Поместите это в ваш скрипт .login:

setenv SHELL /bin/bash
exec bash -l

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

Джонатан Леффлер
источник
2
Вы также можете положить set shell=/bin/bashвнутрь VIM. Таким образом, вы можете сохранить свою оболочку, но использовать BASH в VIM и избежать !проблем. Тем не менее, я вижу, что OP все равно предпочитает bash, поэтому ваше решение не только решит проблему с VIM, но и даст OP их предпочтительную оболочку.
Дэвид В.
Вы правы, @DavidW. Так как любой может установить свою оболочку в vim(или vi) так, как ему нравится, в принципе невозможно ограничить доступ к системе, если вы разрешите пользователю доступ к viили vim. В прошлом люди пытались настроить оболочку на специальную программу, которая выполняет только определенные команды. Однако, если одной из этих команд является viили vim, то они в любом случае имеют доступ к системе.
Джонатан Леффлер
Мне жаль, что, поскольку я новичок на этом сайте, я не знаю, как прокомментировать этот ответ раньше. Спасибо большое за помощь. @JonathanLeffler & DavidW.
JQK
2

Оболочка по умолчанию для любого пользователя хранится в файле / etc / passwd. Пользователь может изменить свою оболочку по умолчанию на любую из оболочек, перечисленных в / etc / shells, выполнив chshкоманду. Обратитесь к справочным страницам chsh (1) и shells (5) для получения дополнительной информации.

Этот ответ является «более правильным», чем подход замены текущей оболочки после входа в систему, поскольку нет необходимости запускать нежелательную оболочку в первую очередь. Такой подход полезен только тогда, когда администратор пренебрег файлом / etc / shells и забыл добавить в него 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) .login метод

Если я напишу

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

в .login

но ни что-то вроде "set shell = ..." в ~ / .vimrc и "bash ..." в ~ / .cshrc, все в порядке. Теперь «echo $ 0» возвращает «bash», а «echo $ SHELL» - «/ bin / bash».

Bash во второй строке можно заменить на "bash -l". Следует отметить, что если я заменю его на «exec bash» или «exec bash -l», то я не смогу войти в свою учетную запись. (Система автоматически закрывается быстро.) Я тоже не знаю почему.

Я думаю, что второй метод великолепен. Я очень ценю вашу помощь.

JQK
источник