вызвать CD в сценарии оболочки - PullRequest
2 голосов
/ 29 марта 2012

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

    $PROJECT_DIR = "$PROJECT_DIR";

    echo "$PROJECT_DIR" > "$PROJECT_DIR/Testing/buildProductPathHello.txt"

osascript -e 'tell app "Terminal"
    do script "pwd"
    do script "cd $PROJECT_DIR" in window 1
    do script "ls" in window 1
    do script "./RunTests.pl" in window 1
end tell'

Переменная $PROJECT_DIR содержит путь, я проверяю это, записывая путь вфайл.В конечном счете, это команда cd $PROJECT_DIR, которая не работает.Не выполняет cd для содержимого переменной.

snapshot of terminal

snapshot 2 PS: это на mac с оболочкой bash

Ответы [ 3 ]

7 голосов
/ 29 марта 2012

Каждый сценарий запускается как собственный процесс, выполняет свои функции и завершается.Состояние сценария, включая переменные окружения и его текущее определение каталога , сбрасывается при его выходе - поэтому вы не можете ожидать, что сценарий, который ничего не делает, кроме "cd", все равно будет действовать позже.

Если вместо этого вы сделаете что-то вроде этого:

do script "cd $PROJECT_DIR; ls; ./runTests.pl"

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

3 голосов
/ 29 марта 2012

В этом случае CD не нужен; просто объедините два звонка, т.е. выполнить скрипт "$ PROJECT_DIR / ls" в окне 1

1 голос
/ 29 марта 2012

Переменные среды также характерны для каждого процесса.

То, как вы вызываете osascript со строкой в ​​одинарных кавычках, говорит исходному экземпляру bash не заменять имена переменных. Фактически он отправляет "cd $PROJECT_DIR" на osascript, что отправляет cd $PROJECT_DIR на терминал.

Но $PROJECT_DIR не установлен в процессе получения bash - тот, который работает в вашем окне терминала. Вы можете убедиться в этом, добавив строку типа do script "set" in window 1 или do script "echo $PROJECT_DIR" in window 1.

Если вы заключите часть скрипта с именем переменной в двойные кавычки, оригинальный процесс bash заменит вместо этого значение $ PROJECT_DIR:

osascript -e 'tell app "Terminal"
    do script "pwd"
    do script "cd '"$PROJECT_DIR"'" in window 1
    do script "ls" in window 1
    do script "./RunTests.pl" in window 1
end tell'

(синтаксис, предложенный CharlesDuffy)

...