set - отображение и изменение переменных оболочки
Краткое описание
set set (-f | --function) (-l | local) (-g | --global) (-U | --universal) set [-Uflg] NAME [VALUE ...] set [-Uflg] NAME[[INDEX ...]] [VALUE ...] set (-a | --append) [-flgU] NAME VALUE ... set (-q | --query) (-e | --erase) [-flgU] [NAME][[INDEX]] ...] set (-S | --show) [NAME ...]
Описание
set манипулирует переменными оболочки.
Если указаны и ИМЯ, и ЗНАЧЕНИЕ, set присваивает значения переменной ИМЯ. Переменные в fish являются списками, разрешается несколько значений. Можно указать один или несколько индексов переменной ИНДЕКС, включая диапазоны (не для всех опций).
Если ЗНАЧЕНИЕ не указано, переменная будет установлена в пустой список.
Если set выполняется без аргументов, она выводит имена и значения всех переменных оболочки в отсортированном порядке. Передача флагов области видимости или экспорта позволяет отфильтровать вывод до переменных, соответствующих этим флагам, поэтому set --local будет отображать только локальные переменные.
С помощью --erase и необязательного флага области видимости set можно удалить соответствующую переменную (или переменную с таким именем в наименьшей возможной области видимости).
С помощью --show, set будет описывать заданные имена переменных, объясняя, как они определены — в какой области видимости, с какими значениями и опциями.
Следующие опции управляют областью видимости переменной:
- -U или --universal
-
Устанавливает универсальную переменную. Переменная будет немедленно доступна во всех экземплярах оболочки пользователя на компьютере и будет сохранена при перезапуске оболочки.
- -f или --function
-
Устанавливает переменную, область видимости которой ограничена выполняемой функцией. Она удаляется по завершении функции.
- -l или --local
-
Устанавливает переменную с локальной областью видимости в этом блоке. Она удаляется по завершении блока. Вне блока это эквивалентно --function.
- -g или --global
-
Устанавливает переменную с глобальной областью видимости. Глобальные переменные доступны для всех функций, выполняемых в той же оболочке. Их можно изменять или удалять.
Эти опции изменяют способ работы переменных:
- --export или -x
-
Делает указанную переменную оболочки доступной дочерним процессам (делает её «переменной окружения»).
- --unexport или -u
-
Делает указанную переменную оболочки недоступной дочерним процессам.
- --path
-
Обрабатывает указанную переменную как переменную пути; переменная будет разбита по двоеточиям (
:) и будет отображаться, соединённая двоеточиями, при цитировании (echo "$PATH") или экспорте. - --unpath
-
Прекращает обработку переменной как переменной пути. Примечание: переменные, заканчивающиеся на «PATH», автоматически являются переменными пути.
Дополнительные опции:
- -a или --append ИМЯ ЗНАЧЕНИЕ …
-
Добавляет ЗНАЧЕНИЯ к текущим значениям переменной ИМЯ. Может использоваться с --prepend для одновременного добавления и вставки в начало. Нельзя использовать при присваивании части переменной.
- -p или --prepend ИМЯ ЗНАЧЕНИЕ …
-
Вставляет ЗНАЧЕНИЯ в начало текущих значений переменной ИМЯ. Может использоваться с --append для одновременного добавления и вставки в начало. Нельзя использовать при присваивании части переменной.
- -e или --erase ИМЯ*[*ИНДЕКС]
-
Удаляет указанные переменные оболочки. Поддерживает удаление из нескольких областей видимости сразу. Можно указать отдельные элементы переменной с индексом ИНДЕКС в квадратных скобках.
- -q или --query ИМЯ*[*ИНДЕКС]
-
Проверяет, определены ли указанные имена переменных. Если указан ИНДЕКС, проверяются элементы с этим индексом. Ничего не выводит, но состояние оболочки устанавливается в количество не определённых переменных, не более 255. Если не указано ни одной переменной, возвращается 255.
- -n или --names
-
Выводит только имена всех определённых переменных, а не их значения. Имена гарантированно отсортированы.
- -S или --show
-
Отображает информацию о заданных переменных. Если имена переменных не указаны, выводятся все переменные в отсортированном порядке. Отображаются области видимости заданных переменных, вместе со значениями в каждой и экспортируется ли она или нет. Другие флаги нельзя использовать с этой опцией.
- -L или --long
-
Не сокращать длинные значения при печати переменных set.
- -h или --help
-
Отображает справку по использованию этой команды.
Если переменная установлена более чем в одно значение, переменная будет списком со специфицированными элементами. Если переменная установлена в нуль элементов, она станет списком с нулём элементов.
Если имя переменной является одним или несколькими элементами списка, например PATH[1 3 7], будут изменены только указанные элементы списка. Если при расширении или присвоении значения списку вы указываете отрицательный индекс, индекс вычисляется с конца списка. Например, индекс -1 соответствует последнему индексу списка.
Правила области видимости при создании или обновлении переменной:
- Переменные могут быть явно установлены как универсальные, глобальные, локальные или относящиеся к функции. Переменные с одинаковым именем, но в разных областях видимости, не изменятся.
- Если область видимости переменной не установлена явно, но такая переменная была определена ранее, используется область видимости существующей переменной. Если переменная уже определена в нескольких областях видимости, будет обновлена переменная с самой узкой областью видимости.
- Если область видимости переменной не установлена явно и переменная с таким именем не была определена ранее, переменная будет локальной для текущей выполняемой функции. Отличие от использования флагов
-lили--localзаключается в том, что в последнем случае переменная будет локальной для самого внутреннего выполняемого блока, а без них — для функции в целом. Если никакая функция не выполняется, переменная будет установлена в глобальной области видимости.
Правила экспорта при создании или обновлении переменной идентичны правилам области видимости для переменных:
- Переменные могут быть явно установлены как экспортируемые или неэкспортируемые. Когда экспортируемая переменная выходит из области видимости, она перестаёт быть экспортируемой.
- Если переменная не установлена явно как экспортируемая или неэкспортируемая, но была определена ранее, сохраняется предыдущее правило экспорта переменной.
- Если переменная не установлена явно как экспортируемая или неэкспортируемая и никогда ранее не была определена, переменная не будет экспортирована.
В режиме запроса можно указать область видимости для проверки. Можно также указать, должна ли переменная быть переменной пути или экспортируемой.
В режиме удаления, если указаны индексы переменных, будут удалены только указанные срезы переменной-списка.
set требует, чтобы все опции предшествовали другим аргументам. Например, set flags -l будет иметь эффект установки значения переменной flags в ‘-l’, а не делает переменную локальной.
Код возврата
В режиме присваивания set не изменяет код возврата, а передает то, что было установлено в status, включая подстановки команд. Это позволяет получать вывод и код возврата подкоманды, как в if set output (command).
В режиме запроса код возврата — это количество переменных, которые не были найдены.
В режиме удаления set завершается с нулевым кодом возврата в случае успеха, с ненулевым кодом возврата, если команда неверна, если какая-либо переменная не существует или является специальной только для чтения переменной.
Примеры
Вывести все глобальные экспортируемые переменные:
> set -gx
Установить значение переменной _$foo_ в ‘hi’.:
> set foo hi
Добавить значение “there” к переменной $foo:
> set -a foo there
Удалить _$smurf_ из области видимости:
> set -e smurf
Удалить _$smurf_ из глобальной и универсальной областей видимости:
> set -e -Ug smurf
Изменить четвёртый элемент списка $PATH на ~/bin:
> set PATH[4] ~/bin
Выводит путь к Python, если type -p возвращает true:
if set python_path (type -p python)
echo "Python is at $python_path"
end
Установка переменной не изменяет $status; подстановка команды всё ещё будет, хотя:
> echo $status 0 > false > set foo bar > echo $status 1 > true > set foo banana (false) > echo $status 1
VAR=VALUE command устанавливает переменную только для одной команды, как и другие оболочки. Это запускает fish с временным домашним каталогом:
> HOME=(mktemp -d) fish
(что по сути то же самое, что):
> begin; set -lx HOME (mktemp -d); fish; end
Примечания
- Версии Fish до 3.0 поддерживали синтаксис
set PATH[1] PATH[4] /bin /sbin, который работал какset PATH[1 4] /bin /sbin.
© 2005-2009 Axel Liljencrantz, 2009-2023 fish-shell contributors
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.7/cmds/set.html