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 манипулирует переменными оболочки.
Если заданы как NAME, так и VALUE, set присваивает любые значения переменной NAME. Переменные в fish являются списками, допускается несколько значений. Можно указать один или несколько индексов переменной INDEX, включая диапазоны (не для всех вариантов).
Если VALUE не задан, переменная будет установлена в пустой список, т. е. ''.
Если set выполняется без аргументов, она выводит имена и значения всех переменных оболочки в отсортированном порядке. Передача флагов scope или export позволяет отфильтровать это, чтобы отображались только соответствующие переменные, поэтому set --local будет отображать только локальные переменные.
С помощью --erase и, необязательно, флага области set будет удалена соответствующая переменная (или переменная с таким же именем в самой маленькой возможной области).
С помощью --show, set будет описывать заданные имена переменных, объясняя, как они были определены - в какой области с какими значениями и параметрами.
Следующие параметры управляют областью действия переменных:
- -U или --universal
-
Устанавливает универсальную переменную. Переменная будет немедленно доступна всем
fishэкземплярам пользователя в системе и сохранится после перезапуска оболочки. - -f или --function
-
Устанавливает переменную, область действия которой ограничена выполняемой функцией. Она удаляется по завершении функции.
- -l или --local
-
Устанавливает переменную локальной области действия в данном блоке. Она удаляется по завершении блока. Вне блока это эквивалентно --function.
- -g или --global
-
Устанавливает переменную глобальной области действия. Глобальные переменные не исчезают и доступны всем функциям, выполняющимся в одной оболочке. Их даже можно изменять.
Эти параметры изменяют поведение переменных:
- --export или -x
-
Вызывает экспорт указанной переменной оболочки в дочерние процессы (делая её «переменной среды»).
- --unexport или -u
-
Вызывает отказ от экспорта указанной переменной оболочки в дочерние процессы.
- --path
-
Обращается к указанной переменной как к переменной пути; переменная будет разделена по двоеточиям (
:) и будет отображаться, соединённая двоеточиями, при использовании кавычек (echo "$PATH") или экспорте. - --unpath
-
Приводит к тому, что переменная больше не будет рассматриваться как переменная пути. Примечание: переменные, оканчивающиеся на «PATH», автоматически являются переменными пути.
Дополнительные параметры:
- -a или --append NAME VALUE …
-
Добавляет VALUES к текущему набору значений для переменной NAME. Может использоваться с --prepend для одновременного добавления и вставки в начало. Не может использоваться при присваивании срезу переменной.
- -p или --prepend NAME VALUE …
-
Вставляет VALUES в начало текущего набора значений для переменной NAME. Может использоваться с --append для одновременного добавления и вставки в начало. Не может использоваться при присваивании срезу переменной.
- -e или --erase NAME*[*INDEX]
-
Приводит к удалению указанных переменных оболочки. Поддерживает удаление из нескольких областей одновременно. Можно указать отдельные элементы в переменной по INDEX в скобках.
- -q или --query NAME*[*INDEX]
-
Проверяет, определены ли указанные имена переменных. Если указан INDEX, проверяются элементы по этому индексу. Не выводит ничего, но состояние оболочки устанавливается в количество указанных переменных, которые не были определены, до максимального значения 255. Если переменные не были указаны, возвращается также 255.
- -n или --names
-
Выводит только имена всех определённых переменных, а не их значения. Имена гарантированно отсортированы.
- -S или --show
-
Отображает информацию о заданных переменных. Если имена переменных не указаны, отображаются все переменные в отсортированном порядке. Отображаются области, в которых заданы переменные, вместе со значениями в каждой и экспортирована ли она или нет. Другие флаги использовать с этим параметром нельзя.
- -L или --long
-
При выводе переменных не сокращать длинные значения.
- -h или --help
-
Отображает справку по использованию данной команды.
Если переменная имеет более одного значения, переменная будет списком с указанными элементами. Если переменной присвоено ноль элементов, она станет списком с нулём элементов.
Если имя переменной является одним или несколькими элементами списка, например PATH[1 3 7], будут изменены только указанные элементы списка. При указании отрицательного индекса при расширении или присваивании списковой переменной индекс будет вычислен с конца списка. Например, индекс -1 означает последний индекс списка.
Правила области действия при создании или обновлении переменной следующие:
- Переменные могут быть явно установлены как универсальные, глобальные, локальные или относящиеся к функции. Переменные с одинаковым именем, но в разных областях действия, не будут изменены.
- Если область действия переменной не задана явно, но переменная с таким именем была определена ранее, используется область действия существующей переменной. Если переменная уже определена в нескольких областях действия, будет обновлена переменная с наименьшей областью действия.
- Если область действия переменной не задана явно и нет существующей переменной с таким именем, переменная будет локальной для текущей выполняемой функции. Обратите внимание, что это отличается от использования флагов
-lили--local, в этом случае переменная будет локальной для наиболее внутреннего из текущих выполняемых блоков, в то время как без них переменная будет локальной для всей функции. Если функция не выполняется, переменная будет установлена в глобальной области.
Правила экспорта при создании или обновлении переменной идентичны правилам области действия для переменных:
- Переменные могут быть явно установлены как экспортируемые или не экспортируемые. Когда экспортируемая переменная выходит из области действия, она становится неэкспортируемой.
- Если переменная не задана явно как экспортируемая или неэкспортируемая, но была определена ранее, сохраняется предыдущее правило экспорта для переменной.
- Если переменная не явно задана как экспортируемая или неэкспортируемая и ранее никогда не была определена, переменная не будет экспортироваться.
В режиме запроса можно указать область, которая должна быть проверена. Также можно указать, должна ли переменная быть переменной пути или экспортироваться.
В режиме удаления, если указаны индексы переменных, будут удалены только указанные срезы списковой переменной.
set требует, чтобы все параметры предшествовали другим аргументам. Например, set flags -l будет иметь эффект установки значения переменной flags в ‘-l’, а не делая переменную локальной.
Код выхода
В режиме присваивания set не изменяет код выхода, а передает то, что было установлено status, включая подстановку команд. Это позволяет захватить вывод и код выхода подкоманды, как в if set output (command).
В режиме запроса код выхода равен количеству переменных, которые не были найдены.
В режиме удаления set завершается с кодом выхода 0 в случае успеха, с ненулевым кодом выхода, если командная строка некорректна, если какая-либо переменная не существовала или была специальной неизменяемой переменной.
Примеры
Вывести все глобальные, экспортируемые переменные:
> 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.6/cmds/set.html