2015-05-18 3 views
2

Мне нужно запустить новое окно терминала из сценария и установить переменную среды в этом новом терминале, чтобы я мог запускать там несколько команд.Установите PATH при запуске нового терминала из сценария в Mac

Это то, что я до сих пор:

#!bin/bash 
PATH=$PATH:$1 
open -a Terminal /my/path/ 

Примечание $1 это значение я посылаю при запуске скрипта, например:

./myScript /my/env/variable/path 

открыт терминал, но окр переменная не установлена. У меня есть аналогичный скрипт в Linux, который отлично работает, но по какой-то причине эта строка PATH=$PATH:$1 работает не так, как ожидалось в Mac.

Любые идеи?

+0

Скорее всего (почти наверняка) скрипты rc, запущенные в новой оболочке вашего терминала, переопределяют это значение. Тестируйте с переменной среды, отличной от PATH - скажем, 'FOOBAR' (обязательно экспортируйте ее, вам не нужно экспортировать PATH здесь, поскольку она уже находится в среде, но FOOBAR не будет) Вероятно, вы увидите его в своем терминале. –

+0

Вы должны использовать 'export' для установки переменной – Zulu

+0

@Zulu, это не обязательно для PATH, так как она уже экспортирована. Изменения в переменных, уже находящихся в среде, распространяются автоматически. –

ответ

5

PATH - это особый случай, поскольку он будет перекрываться почти любым набором дефолтов по умолчанию. Вы должны рассмотреть ваши пользователи ~/.bashrc, ~/.profile и т.д.

Однако, если я бегу:

hello=world open -a Terminal . 

... и в этом терминале запустите

echo "$hello" 

... переменная окружения успешно распространяется.


Теперь, как вы можете это исправить? Один из способов заключается в изменении точечных файлов пользователя уважать другую переменную вы проходящее через:

foo_path=$1 open -a Terminal . 

... и, в ~/.profile и/или ~/.bashrc, в зависимости от обстоятельств:

[ -n "$foo_path" ] && PATH=$PATH:$foo_path 

Вы могли бы даже заменить PATH оптом, когда корректирующее значение доступно, просеивают через другое имя:

# in the user's dotfiles 
[ -n "$PATH_override" ] && PATH=$PATH_override 

# in your script 
PATH_override=$PATH:$1 open -a Terminal . 

Обратите внимание, что ввод назначение на той же строке, что и команда - важная деталь - выполнение этой операции экспортирует переменную в среду для этой единственной команды без необходимости использования явного вызова export.

2

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

OS X, однако, не запускает диспетчер окон из оболочки входа, поэтому приложение Terminal запускает оболочку входа по умолчанию. Самое первое, что происходит в этом процессе, - это получение /etc/profile, которое запускает /usr/libexec/path_helper для создания команды оболочки для инициализации PATH. Однако эта команда устанавливает абсолютный путь, а не добавляет что-либо к предыдущему значению. В результате оболочка в новом окне терминала перезаписывает любые изменения в PATH, которые, возможно, унаследовали от вашего скрипта.

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

  • Настройте терминал, чтобы открыть оболочку не для входа в систему вместо оболочки входа. Однако это предотвратит выполнение /etc/profile или вашего собственного .bash_profile; вы можете захотеть заглянуть в начальный терминал с профилем , кроме значения по умолчанию из вашего сценария, хотя для этого, вероятно, потребуется что-то более сложное, чем простая команда open (вероятно, с AppleScript).
  • Alter PATH в скрипте, открывающемся в терминале, а не унаследовать измененный код PATH.
  • Редактировать /etc/profile удалить вызов /usr/libexec/path_helper, и вместо того, чтобы инициализировать PATH вручную с чем-то вроде

    PATH=$PATH:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin: 
    

    Это на самом деле не рекомендуется, однако.

+0

Оставляя свой ответ здесь, объясняя, почему поведение отличается от Linux и Mac OS X, но Чарльз Даффи предлагает гораздо более чистое решение, чем любое из трех предложенных мной. – chepner

+0

Мне нравится этот ответ, поскольку он гораздо более осведомлен о тонкостях OS X; имеет мое возвышение. –

Смежные вопросы