Запуск csh-скрипта из bash-скрипта

Я пишу скрипт, который требует начальной настройки. установка выполнена в виде csh-скрипта, который имеет много артефактов в переменных окружения. прямо сейчас, когда я запускаю csh из bash, переменные внутри подоболочки bash остаются без изменений.

пример:

#!/bin/bash 
echo $PATH
setevnvar.csh -dir $ROOT_DIR/
echo $PATH

в этом примере я хотел бы видеть, что переменная PATH изменяется после запуска сценария csh (это один из результатов)

буду признателен за любые мысли.


person YAO    schedule 25.01.2017    source источник
comment
Сценарий csh (который должен иметь расширение типа .csh, если оно есть, а не .sh) не может напрямую устанавливать переменные в сценарии bash.   -  person chepner    schedule 25.01.2017
comment
Когда вы говорите is in the form of csh script that has many artifacts on the environment variables --› переменные среды под csh или bash?   -  person Inian    schedule 25.01.2017
comment
переменные устанавливаются внутри csh   -  person YAO    schedule 25.01.2017
comment
@YardenOren: Итак, если я правильно понимаю, вы хотите запустить csh скрипт, который изменяет для вас некоторые bash переменные среды?   -  person Inian    schedule 25.01.2017
comment
@ Иниан, да! я хочу, чтобы .csh изменил переменные, которые находятся в подоболочке скрипта .sh   -  person YAO    schedule 25.01.2017
comment
@YAO: Какую цель это решит? Если вы измените переменные в подоболочке? Это не вступит в силу. Возможно, вам нужно переосмыслить свой вариант использования   -  person Inian    schedule 25.01.2017
comment
@Inian: я пишу скрипт для периодического запуска некоторой функции, требующей этой настройки.   -  person YAO    schedule 25.01.2017
comment
@YAO: Как вы думаете, какая строка в сценарии csh изменит $PATH в bash? Можешь поделиться?   -  person Inian    schedule 25.01.2017
comment
извините, не могу поделиться. я обычно запускаю этот скрипт с исходным setevn, и он добавляется к PATH   -  person YAO    schedule 25.01.2017
comment
@YAO: см. мой ответ ниже. Посмотрите, поможет ли это   -  person Inian    schedule 25.01.2017


Ответы (1)


Невозможно изменить переменные оболочки из любого дочернего процесса. Поскольку запуск csh из bash запускает дочерний процесс, это невозможно сделать.

Варианты у вас есть:

  • Преобразуйте свой csh сценарий в bash и source из вашего bash сценария.
  • Преобразуйте свой bash скрипт в csh и снова source другой скрипт
  • Убедитесь, что нужные вам переменные помечены как export в сценарии csh, и запустите свой сценарий bash из сценария csh (который может работать или не работать для ваших конкретных потребностей), тем самым вывернув все наизнанку.
  • Объедините код из обоих скриптов, чтобы получить один (bash или csh) скрипт

«Поиск» выполняется с помощью встроенного . или (не POSIX) source. Например :

#!/bin/bash 
echo $PATH
. setevnvar.converted_to_bash -dir "$ROOT_DIR/"
echo $PATH

«Sourcing» заставляет текущий процесс считывать команды из другого файла и выполнять их, как если бы они были частью текущего сценария, а не запускать новую оболочку для выполнения этого другого файла. Вот почему присваивание переменных будет работать с этим методом.

Обратите внимание, что я добавил двойные кавычки к вашему расширению "$ROOT_DIR/" для защиты от случая, когда оно будет содержать специальные символы, такие как пробелы.

person Fred    schedule 25.01.2017
comment
Спасибо! так что если у меня будет два скрипта csh, то исходная команда повлияет на внешнюю оболочку (после завершения скрипта)? - person YAO; 25.01.2017
comment
У вас должно быть два сценария, запускаемых одним и тем же интерпретатором (может быть csh, если хотите), но вы должны вызывать сценарий, используя его источник, как показано выше, иначе у вас будет та же проблема. Источник заставляет текущий процесс читать команды из другого файла, как если бы они были частью текущего скрипта, а не запускать новую оболочку для выполнения этого другого файла. - person Fred; 25.01.2017
comment
Интересно, что source не относится к bash, оно происходит от csh! Его эффект не указан в POSIX. - person cdarke; 25.01.2017
comment
@cdarke Спасибо за разъяснение! - person Fred; 25.01.2017