2017-01-25 4 views
0

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

пример:

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

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

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

+1

Скрипт 'csh' (который должен иметь расширение, например' .csh', если оно есть, а не '.sh') не может напрямую устанавливать переменные в скрипт' bash'. – chepner

+0

Когда вы говорите, что 'находится в форме скрипта csh, который имеет много артефактов для переменных среды' -> Переменные среды под' csh' или 'bash'? – Inian

+0

переменные установлены внутри csh – YAO

ответ

1

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

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

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

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

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

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

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

+0

спасибо! поэтому, если у меня будет два сценария csh, то исходная команда повлияет на внешнюю оболочку (после завершения скрипта)? – YAO

+0

У вас должно быть два сценария, запускаемых одним и тем же интерпретатором (может быть 'csh', если вы хотите), но вы * должны * вызывать скрипт, используя его, как показано выше, если нет, у вас будет такая же проблема. «Sourcing» заставляет текущий процесс читать команды из другого файла, как если бы они были частью текущего скрипта, вместо того, чтобы запускать новую оболочку для выполнения этого другого файла. – Fred

+0

Как интересно, 'source' не является' bash' специфическим, он исходит из 'csh'! Этот эффект не указан в POSIX. – cdarke