2014-02-15 2 views
3

У меня есть простой скрипт test.sh

#!/bin/bash 
echo $0 

Когда я запускаю следующее из CSH терминала:

bash -c 'test.sh' 

Тогда выход test.sh

Но когда я бегу:

bash -c 'source test.sh' 

Выход bash

Кто-нибудь знает, как напечатать имя сценария в этом случае?

+0

Вы могли бы сделать что-то вроде 'пса -o«% A»-p«$$»' а чем 'echo $ 0' и синтаксический анализ, но не совсем уверен, почему вы пытаетесь добиться такого же поведения при поиске файла. – BroSlow

+0

Какова цель поиска, когда вы используете совершенно новую оболочку? –

+0

Я экспортирую переменные среды в свой скрипт. Я хочу передать его из csh-терминала, поэтому я запускаю: bash -c 'source test.sh; exec csh ' – Morad

ответ

2
#!/bin/bash 
declare -r SCRIPT_NAME=$(readlink -f ${BASH_SOURCE[0]}) 
3

Когда сценарий запускается с использованием источника, он запускается в пределах существующей оболочки, любые переменные, созданные или измененные сценарием, останутся доступными после завершения сценария. Напротив, если скрипт запускается как имя файла, тогда для запуска скрипта будет создана отдельная подоболочка (с полностью отдельным набором переменных).

Также необходимо изменить сценарии оболочки

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

Единственный способ выполнить то, что вы пытаетесь, может состоять в том, чтобы составить стандартный поток вывода, который содержит список назначений переменных оболочки. Затем стандартный вывод можно использовать как вход для родительского «источника» или «.». команда. Использование «шумной» программы, такой как сделать, чтобы сделать это, будет значительно сложнее.

2

Если из csh вы пытаетесь достичь переменных сеанса, определенных в сценарии оболочки bash, вы должны вызвать сценарий bash до запуска csh.

Сеанс получает в наследство на подпроцессы, как это так, где csh.SESSION и csh.SESSION_INHERITED объединены один раз ЖСС сапог »:

bash/ 
├── csh 
│   ├── SESSION 
│   └── SESSION_INHERITED 
└── SESSION 

bash.SESSION НЕ доступны из CSH оболочки так как это приведет к уровню выполнения init для любых подпроцессов. Это fork, который во время икру дублирует среду.

Итак, вы можете работать от bash: source test.sh; csh. Это приведет к экспорту из test.sh в csh, но это статический экспорт, который не может быть изменен программно в csh.

Есть не 100% понял ваш вопрос, так как его очень абстрактно .. Но это, надеюсь, поможет :)

2

Используйте $ BASH_SOURCE. От человека-страницы:

BASH_SOURCE 
     An array variable whose members are the source filenames where 
     the corresponding shell function names in the FUNCNAME array 
     variable are defined. The shell function ${FUNCNAME[$i]} is 
     defined in the file ${BASH_SOURCE[$i]} and called from 
     ${BASH_SOURCE[$i+1]}. 

Вы можете просто сослаться на $ BASH_SOURCE вместо $ {BASH_SOURCE [0]}, так разыменования переменной массива в Баш без индекса даст вам первый элемент.

Это обычная картина в моем сценарии, чтобы различное поведение для сорсинговый против выполнения сценария:

foo() { 
    some cool function 
} 

if [[ "$BASH_SOURCE" == "$0" ]]; then 
    # actually run it 
    foo "[email protected]" 
fi 
Смежные вопросы