Разница между set -g и set -x

289
11th Hour Worker

В настоящее время я перехожу с конфигов bash на рыбу и застрял, переводя мой экспорт через bash. Кажется, есть три способа сделать это в Fish, которые выполняют свою работу, но я не могу сказать, какой из них мне следует использовать, или если у них есть побочные эффекты, о которых я не знаю

set -g VAR value set -x VAR value set -xg VAR value 

Конечно, они не все делают одно и то же. Может кто-нибудь объяснить, в чем различия и в каких ситуациях каждый уместен, пожалуйста?

0
Набрав `set -h`, вы увидите значения в параметрах области действия. AFH 5 лет назад 0

1 ответ на вопрос

3
Kurtis Rader

Нет, они не все делают одно и то же. -xФлаг ортогональны -g, -lи -uфлаги. Первый просто устанавливает атрибут экспорта в var. Последние три определяют область действия вар. Вы можете иметь глобальную, неэкспортированную VARи внутри функцию do set -lx VAR valueдля создания экспортируемого экземпляра с локальной областью действия. Когда управление возвращается из функции, глобальная область VARснова появляется и не будет экспортирована.

Если вы используете последнюю версию (2.7, возможно, 2.6), вы можете set --show VARотобразить значения во всех трех областях и узнать, экспортируется ли каждая из них.

Извините, что это значит для экспортируемой переменной? 11th Hour Worker 5 лет назад 0
Экспортированная переменная видна командам, запускаемым вашей рыбной оболочкой. Сделайте `set -g NOT_EXPORTED abc; set -gx EXPORTED def; env | grep EXPORTED`. Обратите внимание, что env - это внешняя команда, которая показывает экспортированные переменные, которые она унаследовала. Он должен показать, что присутствует только переменная, созданная с помощью `set -gx`. Kurtis Rader 5 лет назад 0
Спасибо за объяснение Куртис. Это то, что я понял, но теперь я сбит с толку, почему я вижу переменные окружения, которые я установил внутри моего config.fish, используя `set -g`? 11th Hour Worker 5 лет назад 0
Если переменная уже экспортирована, то `set -g` сохраняет экспортированный атрибут. Так что, если, например, вы делаете что-то вроде `set -g PATH / dir1 / dir2 $ PATH`, оно останется экспортированным, потому что это было в экспортированной среде, когда рыба начала работать. Kurtis Rader 5 лет назад 0
Ранее я определил свою переменную с помощью -x для тестирования и не удалял эту строку, ожидая, что она будет перезаписана в моем следующем объявлении моей переменной. Большое спасибо, Куртис! Все это имеет смысл для меня сейчас :) 11th Hour Worker 5 лет назад 0