Как заставить csh создать источник файла, а затем перейти в интерактивный режим?

BRIEF

как мне (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

DETAIL

Я пользователь 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 ...
7
задан Krazy Glew 29 January 2013 в 22:58
поделиться