У меня есть обычный командный сценарий shell csh, который имеет следующую структуру. Я хочу порождать новые терминалы и выполнять некоторые последующие команды В созданных новых оболочках.
xterm & ;
исходный текст myscript.scr;
cd fred;
run_tool &
xterm & ; source myscript.scr; cd bill ; run_tool &
Я запускаю свой скрипт в терминале csh под названием, скажем, term1. Итак, первая часть - я хочу открыть новый терминал term2, а затем в этом вновь открытом терминале term2 выполнить следующие несколько команд. Затем я также хочу открыть еще один терминал от исходного терминала term1 и выполнить некоторые другие команды в этом новом терминале, скажем term3
Я обнаружил, что новый терминал term2 создается, но затем команды, которые следуют за ним, выполняются в исходном терминале term1, а не в новом терминале term2.
Пожалуйста, подскажите, как сделать так, чтобы мои последующие команды "переносились" в новую оболочку для выполнения там, отметив также, что мне нужно вернуться и создать новый терминал
Использование:
xterm -e "myscript.scr; cd fred; run _tool" &
xterm -e "source myscript.scr; cd bull; run_tool" &
Переключатель -e
выполнит указана команда внутри сеанса xterm
, а не после it, как в вашем примере.
На странице руководства:
-e программа [аргументы ...]
Эта опция указывает программу (и ее аргументы командной строки), которая должна быть запущена в окне xterm. Он также устанавливает заголовок окна и имя значка как базовое имя выполняемой программы, если в командной строке не указаны ни -T, ни -n. Это должен быть последний параметр в командной строке.
Я думаю, что вам нужно что-то вроде этого
xterm &
(source myscript.scr; cd fred; run_tool ) &
В этом случае первая команда будет запущена в текущем сеансе оболочки и будет переведена в фоновый режим. Вторая команда будет запущена в новом сеансе, созданном из текущего сеанса, а также в фоновом режиме.
Однако меня немного смущает использование вами в вопросе «терминала» и «оболочки». Вы пытаетесь загрузить новое интерактивное окно терминала? Или просто запускать команды, не затрагивая текущий сеанс оболочки?
Обычно я делаю следующее, чтобы мои действия не влияли на мой текущий сеанс:
for my_dir in $some_list_of_dirs; do
(
cd "$my_dir"
do stuff
)
done
Таким образом, ваш рабочий каталог не будет изменен в основном сеансе, только в подсессии, и любые изменения, которые вы вносите в свою среду в подсессии, не будут распространяться на основной сеанс.