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

Наша компания использует систему 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?

3 ответа

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

setenv SHELL /bin/bash
exec bash -l

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

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

Этот ответ является "более правильным", чем подход к замене текущей оболочки после входа в систему, поскольку нет необходимости запускать нежелательную оболочку в первую очередь. Такой подход полезен только тогда, когда администратор пренебрег файлом / etc / shells и забыл добавить в него bash (никогда).

Спасибо за вашу большую помощь.

Прежде чем дать окончательное решение, которое я выберу, я должен указать на ошибку в моем первоначальном вопросе. Мой оригинальный.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", я не смогу войти в свою учетную запись. (Система автоматически закрывается быстро.) Я тоже не знаю почему.

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

Другие вопросы по тегам