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