как мне (1) запустить новый csh, (2) заставить его выполнить несколько команд, которые НЕ находятся ни в одном .cshrc (хотя я мог бы организовать их в нестандартном месте, чтобы они были исходными) и (3) затем перейти в интерактивный режим?
Например, есть ли способ заставить csh или tcsh засунуть альтернативные файлы запуска, кроме тех, что описаны на http://www.manpagez.com/man/1/tcsh/, где говорится
Запуск и выключение Оболочка входа в систему начинается с выполнения команд из системных файлов /etc/csh.cshrc и /etc/csh.login. Затем она выполняет команды из файлов в домашнем каталоге пользователя: сначала ~/.tcshrc (+) или, если ~/.tcshrc не найден, ~/.cshrc, затем ~/.history (или значение переменной оболочки histfile), затем ~/.login и, наконец, ~/.cshdirs (или значение переменной оболочки значение переменной оболочки dirsfile) (+). Оболочка может прочитать /etc/csh.login до, а не после /etc/csh.cshrc, и ~/.login до, а не после ~/.tcshrc или ~/.cshrc и ~/.history, если они скомпилированы. скомпилированы; см. переменную оболочки version. (+)
Non-login shells read only /etc/csh.cshrc and ~/.tcshrc or ~/.cshrc
Я пользователь bash. Но я работаю в компании по производству аппаратного обеспечения, где (1) многие люди - пользователи csh, и (2) многие инструменты CAD зависят от вещей в окружении, таких как система модулей.
Многие рецепты - например, внутренние страницы вики, где люди объясняют, как делать то или иное, - начинаются примерно так
start a new shell or xterm
source /proj/Foo/setup.proj
source ~some_engineer/env/setup-for-this-tool
now run the tool
Часто переменные окружения конфликтуют; иногда мне приходится удалять все мои ~/.* файлы, заходить в систему заново и т.д.
Я хотел бы автоматизировать многие из этих действий. Действительно, я автоматизировал многие из них. Однако мне пришлось автоматизировать их с помощью expect (на самом деле, Perl CPAN Expect), чтобы притвориться интерактивным пользователем.
Попутно у меня появился собственный скрипт clear-env, который я часто использую для запуска оболочки почти без переменных окружения. Используется он так:
clear-env -keep HOME -- csh
and then either pipe commands in through expect
or run interactively
Это работает для автоматизации. Но иногда мне действительно нужно быть интерактивным - но только после того, как я загрузил несколько строк длинных имен исходных сценариев.
Я хотел бы иметь возможность загрузить эти исходные файлы, а затем вернуться к интерактивному режиму.
Например, я пробовал
clear-env -keep HOME -- csh -c 'source filename' -i
...
or, без clear-env
csh -c 'source filename' -i
...
в надежде, что он выполнит команду -c, а затем станет интерактивным. Но он выполняет только команду -c.
Я смог передать команды в csh через expect в собственном скрипте на perl, который считывает мой tty, а затем передает команду в csh через expect. Однако тогда я теряю интерактивные возможности csh.
Есть ли лучший способ? Какой-нибудь способ сказать: "С этого момента я хочу, чтобы ты переподключил свой управляющий терминал к этому другому терминалу?"
Спасибо.
Кстати, это было бы полезно и для других оболочек. Однако, по моему опыту, пользователи csh наиболее склонны к написанию рецептов, которые должны выполняться вручную.
--
Возможно, я не совсем ясно выражаюсь:
я знаю о
exec tcsh -c "source stuff ; exec bash"
и exec csh -c "source stuff ; exec csh"
Ситуация в том, что я уже проделал долгий путь к инструменту, скрипту, используя "интерактивные" команды через Expect.
Теперь, после того, как я выполнил эту псевдоинтерактивную настройку, наконец я хочу вернуться к действительно интерактивной работе. По сути, сменив управляющий терминал для оболочки с pty, который использовал Expect, на настоящий pty.
Я смог сделать это, создав перенаправляющий процесс.
Но я надеялся, что смогу переключиться. Или сделать что-то вроде
... long
... sequence
... of expect commands
exec csh -i < /dev/my-pty ...