Set команды в linux

Обновлено: 30.06.2024

Команда set рассматривалась при изучении процесса отладки для подключения и отключения опций. Эту команду можно также использовать для передачи аргументов в пределах сценария. Опишем, как происходит этот процесс. Предположим, что сценарий должен обработать два параметра. Вместо передачи параметров в сценарий выполняют их задание в сценарии. Для этого применяется команда set.

set параметр1 параметр2..

В следующем примере параметрам присваиваются значения accounts.doc, и accounts.bak. Затем в сценарии по этим параметрам выполняется цикл.

set accounts.doc accounts.bak

Команду set удобно использовать, если при проверке сценария необходимы параметры. Дело в том, что вновь введенные аргументы сохраняются всякий раз, когда выполняется сценарий.

3.6.4. Команда help

3.6.4. Команда help Выше уже упоминалась система помощи по встроенным командам оболочки bash - команда help. Если ввести в командной строке help без параметров, вы получите список всех встроенных команд оболочки. Если ввести команду help name, где name - имя одной из этих команд, то вы

4.6.3. Команда cat

4.6.3. Команда cat Команда cat часто используется для создания файлов (хотя можно воспользоваться и командой touch). По команде cat на стандартный вывод (т. е. на экран) выводится содержимое указанного файла (или нескольких файлов, если их имена последовательно задать в качестве

4.6.4. Команда cp

4.6.4. Команда cp Хотя для копирования файлов иногда пользуются командой cat, но в Linux существует для этого специальная команда cp. Ее можно применять в одной из двух форм:[user]$ cp [options] source destination[user]$ cp [options] source_directory new_directoryВ первом случае файл или каталог source копируется,

4.6.5. Команда mv

4.6.5. Команда mv Если вам необходимо не скопировать, а переместить файл из одного каталога в другой, вы можете воспользоваться командой mv. Синтаксис этой команды аналогичен синтаксису команды cp. Более того, она сначала копирует файл (или каталог), а только потом удаляет

5.4.3 Команда cat

5.4.3 Команда cat Мы уже рассматривали кратко команду cat в предыдущем разделе. В данном разделе эта команда интересует нас в основном потому, что чаще всего она работает как раз с входным и выходным потоками. По умолчанию выход команды cat направляется в выходной поток. Чтобы

5.10. Команда sh

5.10. Команда sh Вы всегда можете запустить новый экземпляр оболочки bash, дав команду bash или sh. При этом можно заставить новый экземпляр оболочки выполнить какой-то скрипт, если передать имя скрипта в виде аргумента команды bash. Так, для выполнения скрипта myscript надо дать

8.4.1. Команда ps

8.4.1. Команда ps Когда я заглянул в man-страницу, посвященную команде ps, я был поражен, как много у нее разных опций. Как оказалось, GNU-версия этой программы, входящая в состав Linux, поддерживает опции в стиле трех разных типов UNIX. Опции в стиле Unix98 состоят из одного или нескольких

Команда

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

5.2.7.2. Команда SET

5.2.7.2. Команда SET SET var_name = expr [, var_name = expr] …Инструкция SET в сохраненных подпрограммах представляет собой расширенную версию общей инструкции SET. Вызванные переменные могут быть объявлены внутри подпрограммы или глобальными переменными системы.Инструкция SET в сохраненных

3.2. Команда at

3.2. Команда at Команда at позволяет передавать задания демону cron для одноразового выполнения в назначенное время. Выдавая задание, команда at сохраняет в отдельном файле как его текст, так и все текущие переменные среды. Заметим, что команда crontab не делает этого. По умолчанию

5.3. Команда cat

5.3. Команда cat Команда cat довольно проста, но универсальна. Эту команду удобно применять как для отображения файла, так и для его создания, а также при отображении файлов, содержащих управляющие символы. Используя команду cat, следует учитывать, что процесс вывода не

24.1.1. Команда pwd

24.1.1. Команда pwd Эта команда отображает текущий каталог:$

24.1.2. Команда set

24.1.2. Команда set Команда set рассматривалась при изучении процесса отладки для подключения и отключения опций. Эту команду можно также использовать для передачи аргументов в пределах сценария. Опишем, как происходит этот процесс. Предположим, что сценарий должен

Команда Set Linux

Изучение

Команда Linux set — это встроенная команда оболочки, которая позволяет отображать или устанавливать переменные оболочки и среды. В этом руководстве мы рассмотрим команду set и продемонстрируем различные способы использования утилиты командной строки.

Базовый синтаксис

Команда set имеет следующий синтаксис:

Параметры команды

Существует множество опций, которые можно использовать с командой set. Давайте рассмотрим некоторые из них:

  • -a: опция -a устанавливает все созданные или измененные переменные или функции для экспорта.
  • -b: опция -b немедленно предупреждает пользователя о завершении фоновых заданий.
  • -e:параметр -e указывает оболочке выйти, если команда дает ненулевой статус выхода. Проще говоря, оболочка завершает работу при сбое команды.
  • -f:опция -f отключает создание имен файлов.
  • -h:опция -h включена по умолчанию. Он находит и запоминает функцию, ожидающую выполнения.
  • -n:опция -n только читает команды, но не выполняет их.
  • -t:опция -t завершает работу после чтения и выполнения одной команды.
  • -u:опция -u обрабатывает неустановленные или неопределенные переменные, за исключением специальных параметров, таких как подстановочные знаки (*) или «@», как ошибки во время раскрытия параметра.
  • -v:опция -v распечатывает строки ввода оболочки по мере их чтения.
  • -x:опция -x печатает аргументы команды во время выполнения

Выходные значения

Ниже приведены значения выхода оболочки, связанные с командой set:

0: Команда выполнена успешно.

  1. Команда не выполнена из-за неверного аргумента команды
  2. Ошибка команды из-за отсутствия ожидаемого аргумента

Установить команду без каких-либо параметров

Без аргументов команда set выводит список всех переменных оболочки, включая их значения.

Без аргументов команда set выводит список всех переменных оболочки

Установите позиционные параметры с помощью команды Set

Команду Linux set можно использовать для присвоения значений позиционным параметрам. Позиционный параметр — это переменная в программе оболочки, и на его значение ссылаются как на $ , где N — цифра, обозначающая позицию параметра.

Значение $ 1 — это первый позиционный параметр после имени файла или команды. Значение $ 2 — это второй параметр и так далее.

Предположим, мы выполняем команду, показанную ниже:

Здесь красный цвет соответствует позиционному параметру $ 1, синий соответствует параметру $ 2 и, наконец, зеленый цвет соответствует параметру $ 3.

Чтобы перечислить все параметры в порядке $ 1 $ 2 $ 3, выполните приведенную ниже команду echo:

Чтобы перечислить первый параметр, выполните:

Чтобы вывести второй параметр, запустите:

Чтобы вывести второй параметр, запустите

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

Чтобы отключить позиционные параметры, запустите команду set с двойным дефисом, как показано.

Еще раз, если вы попытаетесь перечислить позиционные параметры, вы получите пустой результат, подразумевая, что они не были установлены.

Еще раз, если вы попытаетесь перечислить позиционные параметры

Игнорировать несвязанную переменную

По умолчанию сценарий оболочки игнорирует неопределенную переменную. В приведенном ниже скрипте myscript.sh переменная $ foo еще не определена и, следовательно, не существует.

По умолчанию сценарий оболочки игнорирует неопределенную переменную

Когда скрипт запускается, он возвращает пустую строку для строки, содержащей несуществующую переменную, и переходит к выполнению следующей строки:

Эта аномалия нежелательна, и разработчики хотели бы получать уведомления в случае неопределенных переменных. Директива set -u в начале скрипта выводит ошибку в оболочке, если скрипт запускает неопределенную переменную.

Когда скрипт запускается еще раз, отображается ошибка о несвязанной переменной.

Отображение ошибки, если команда не существует

Обычно, если команда вызывает ошибку и не может быть выполнена, оболочка bash продолжит выполнение оставшихся команд. Возьмем, к примеру, сценарий оболочки ниже:

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

Как и в предыдущем примере, это не очень хорошая практика при написании сценариев оболочки, особенно для обеспечения безопасности и отладки. В идеале сценарий должен останавливаться при обнаружении ошибки. Для решения этого сценария определите директиву set -e в начале сценария, как показано.

Когда вы снова попытаетесь запустить скрипт, вы столкнетесь с ошибкой, как показано ниже:

Отображение ошибки в командах по конвейеру

Директива set -e не работает при работе с конвейерными командами. Рассмотрим сценарий ниже:

Когда вы запускаете сценарий, он возвращает ошибку, но продолжает выполнять следующую команду:

Чтобы преодолеть это препятствие, передайте директиву set -eo pipefail, как показано:

На этот раз сценарий завершается и не выполняет следующую строку.

Определите параметры Allexport и уведомления

Чтобы установить параметры allexport и notify, выполните команду:

Заключение

Это было несколько примеров того, как вы можете использовать команду set в сценариях оболочки. Как уже отмечалось, команда set может быть удобным инструментом для установки позиционных параметров и отладки сценариев оболочки.

Запущенный без опций set показывает все shell-переменные и переменные среды (только в POSIX -режиме) в формате NAME=VALUE

Атрибуты

Атрибуты показанные ниже включаются так -X , а выключаются +X . (Такая перевернутая схема включения/выключения пришла в bash исторически, т.к. опции обычно включались в виде -X . Прямо как с электрическим зарядами)

Флаг
Название опции Описание
-a allexport Автоматически отмечает измененные переменные.
Automatically mark new and altered variables to be exported to subsequent environments.
-b notify Не ждет нажатия enter чтобы оповестить о завершившемся в фоне job-е. (Оповещения работают только для управления job-ами)
-e errexit When set, the shell exits when a simple command in a command list exits non-zero ( FALSE ). This is not done in situations, where the exit code is already checked ( if , while , until , || , && )
-f noglob Отменяет развертывание путей и имен файлов (globbing)
-h hashall Запоминает абсолютное расположение команды если она вызывалась, и использует в следующий раз этот путь (хеширование). Включено по-умолчанию. (см checkhash из списка опций shopt)
-k keyword Разрешает подставлять значение перемернной среды окружения везде в командной строке, а не только во время вызова команды.
-m monitor Monitor mode. При управлении job-ами будет выведено короткое описание завершенного в фоне задания. По-умолчанию включено для для интерактивных оболочек с управлением job-ами.
-n noexec Читает и парсит команды из скрипта, но не исполняет их. Полезно для проверки сценария на предмет синтаксических ошибок. Игнорируется интерактивными оболочками.
-o
Устаналивает или снимает опцию по её длинному имени. Например set -o noglob . Если никакой опции не задано, то выводится список всех опций и их статус.
-p privileged Включает привилегированный режим.
-t onecmd Выходит после чтения и выполнения одной команды.
-u nounset Рассматривает сброс (unset) переменной как ошибку при выполнении parameter expansion. Неинтерактивные оболочки завершают свое выполнение при такой ошибке.
-v verbose Выводит прочитанные или введенные строки при выполнении. Полезно при отладке.
-x xtrace Режим отладки. Перед выполнением команды печатает её со всеми уже развернутыми подстановками и вычислениями.
-B braceexpand Оболочка осуществляет раскрытие скобок. разворачивание (раскрытие) скобок. Эта опция включена по-умолчанию.
-C noclobber Не перезаписывает файлы в операциях перенаправлениях потока. Вы можете обойти это ограничение используя оператор перенаправления >| там где это необходимо. Смотрите перенаправления
-E errtrace ERR -ловушки будут наследоваться функциями оболочки, подстановками команд и командами которые выполняются в окружении подоболочки.
-H histexpand Разрешены подстановки из истории команд ( ! -style). По умолчанию включено для интерактивных оболочек.
-P physical Не следовать по симлинкам когда изменяются директории, use the physical filesystem structure.
-T functrace DEBUG - и RETURN -ловушки будут унаследованы последующими средами. Аналогично как -E для ERR -ловушек.
-
Означает "конец опций" - все следующие аргументы будут рассматриваться как позиционные параметры, даже если начинаются с минуса, как опции.
--
If no arguments follow, the positional parameters are unset. With arguments, the positional parameters are set, even if the strings begin with a - (dash) like an option.
Длинные опции, -o у которых нет короткого экивалента.

emacs Включает emacs -стиль для редактирования команд. По-умолчанию включена.

history Ведется история команд. Включена по-умолчанию для интерактивных оболочек.

ignoreeof Такой же эффект как и команды IGNOREEOF=10 . Смотрите shell variables.

nolog (В настоящее время игнорируется. currently ignored)

pipefail If set, the exit code from a pipeline is different to the normal ("last command in pipeline") behaviour: TRUE when no command failed, FALSE when something failed (code of the rightmost command that failed)

posix Когда эта опция установлена - Bash работает в режиме POSIX .

vi Включает vi -стиль для редактирования команд. По-умолчанию включена.

Примеры

Часть скрипта, который показывает как включить-выключить вывод отладочной информации в скрипте ( -x ):

Соображения относительно портируемости

Команда set ее основы поведения оболочки при измененных опциях определены POSIX®. Однако, есть опции, специфичные для Bash. Естественно они не переносимы.



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

$ fortune
No amount of careful planning will ever replace dumb luck.

(приложение fortune может быть не установлено, запустите установку в пакетном менеджере вашего дистрибутива, например apt-get install fortune — прим. пер.)

.bash_profile

Теперь давайте сделаем так чтобы fortune запускалось при каждой авторизации. Используя любимый текстовый редактор отредактируйте файл .bash_profile в вашей домашней директории. Если такого файла не существует, создайте его. Вставьте в его начало:

fortune

Попробуйте выйти из системы и зайдите обратно. До запуска менеджера дисплея, такого как например xdm, gdm или kdm, вы увидите веселое приветствие, когда войдете:

Оболочка входа.

При запуске bash проходит файл .bash_profile в вашей домашней директории, запуская каждую строчку как будто набирая ее в командной строке. Это называется интерпретацией файла (file sourcing).

Bash может работать различным образом в зависимости от того, как он запущен. Если он запущен как оболочка входа, то будет работать, как описано выше — сначала обработая общесистемный /etc/profile, а затем ваш личный

Существуют два способа запуска bash в качестве оболочки входа. Первый используется когда вы впервые входите в систему: bash запускается с именем процесса -bash. Можно увидеть это в выводе списка процессов:

$ ps u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
chouser 404 0.0 0.0 2508 156 tty2 S 2001 0:00 -bash

Вы, вероятно, увидите более длинный список, но но в нем будет как минимум одна строка с чертой перед именем вашей оболочки, как -bash в примере выше. Эта черта используется оболочкой, чтобы определить, была ли она запущена при авторизации.

Понимание --login

Второй способ запустить bash как оболочку входа — при помощи опции —login. Время от времени эта возможность используется эмуляторами терминала (вроде xterm) чтобы их сессия bash выглядела как при изначальном входе в системе.

После авторизации можно запустить много копий вашей оболочки. У тех из них которые запущены без опции --login или не имеют черточки перед именем процесса, поведение будет иным нежели при запуске с авторизацией. Они предоставляют вам командную строку, однако, называются они интерактивными оболочками. Если bash запущена интерактивно, без авторизации, она проигнорирует /etc/profile и

/.bash_profile вместо этого обработает

Проверка на интерактивность

/.bashrc не будучи запущенным интерактивно, например при использовании команд типа rsh или scp. Это важно помнить потому как вывод текста, как в примере с командой fortune выше, может испортить эти неинтерактивные сессии bash. Хорошей идеей является использование переменной PS1 для проверки факта интерактивности текущей сессии перед выводом текста:

/etc/profile и /etc/skel

Как системный администратор, вы отвечаете за файл /etc/profile. Так как им руководствуются все кто впервые входят в систему, важно держать его в рабочем состоянии. Это также очень мощный инструмент, используемый для того чтобы заставить вещи работать правильно для новых пользователей сразу после того как они войдут используя свою новую учетную запись.

Однако, существует вариант, при котором, настройки с одной стороны, могут быть выставлены в значения по-умолчанию для новых пользователей, а с другой, могут быть легко ими изменены при необходимости. Как раз для этого и существует директория /etc/skel. При использовании команды useradd для создания новой учетной записи, все файлы из /etc/skel копируются в домашний каталог нового пользователя. Это означает, что вы можете положить, например, .bash_profile и .bashrc в /etc/skel для более комфортного начала работы нового пользователя.

export

Переменные в bash могут быть помечены таким образом, что они будут устанавливаться во всех вновь запускаемых командных оболочках. Это означает, что они обозначены как внешние (export). Вы можете заставить bash отобразить список всех таким образом обозначенных внешних переменных в вашей сессии bash:

$ export
declare -x EDITOR="vim"
declare -x HOME="/home/chouser"
declare -x MAIL="/var/spool/mail/chouser"
declare -x PAGER="/usr/bin/less"
declare -x PATH="/bin:/usr/bin:/usr/local/bin:/home/chouser/bin"
declare -x PWD="/home/chouser"
declare -x TERM="xterm"
declare -x USER="chouser"

Экспортирование переменных

Если переменная не отмечена на экспорт, её значение не будет задано для новых запускаемых оболочек. Но вы можете отметить переменную на экспорт, передав её встроенной команде export:

$ FOO=foo
$ BAR=bar
$ export BAR
$ echo $FOO $BAR
foo bar
$ bash
$ echo $FOO $BAR
bar

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

$ exit
$ echo $FOO $BAR
foo bar

Export и set -x


В связи с вышеописанным поведением, переменные могут быть указаны в

/.bash_profile или /etc/profile и помечены для экспорта, для того, чтобы в дальнейшем не было необходимости указывать их снова. Но есть несколько опций которые не могут быть экспортированы, и поэтому они должны быть заданы в

/.bashrc и в вашем профиле последовательно. Эти опции настраиваются при помощи встроенной команды set:

$ set -x

Опция -x заставляет bash вывести на экран каждую команду, которую он собирается выполнить:

$ echo $FOO
$ echo foo
foo

Это может быть очень полезно для понимания непредвиденного поведения команд при использовании кавычек или похожих странностей. Чтобы выключить опцию -x, используйте set +x. Обратитесь к странице документации man за всеми опциями встроенной команды set.

Установка переменных с «set»

Команда set может также использоваться для задания значений переменных, но при этом указание самой этой команды не является обязательным. Команда в bash «set FOO=foo» делает то же самое, что и «FOO=foo». Сброс значения переменной осуществляется встроенной unset:

$ FOO=bar
$ echo $FOO
bar
$ unset FOO
$ echo $FOO

Unset vs. FOO=

Это не то же самое, что установка переменной пустым значением, хотя порой это сложно объяснить. Один из способов эту разницу заметить — вызвать команду set без параметров, чтобы вывести список всех текущих переменных:

$ FOO=bar
$ set | grep ^FOO
FOO=bar
$ FOO=
$ set | grep ^FOO
FOO=
$ unset FOO
$ set | grep ^FOO

Использование set без параметров похоже на использование встроенной команды export за исключением того, что set отображает все переменные, а не только обозначенные как внешние.

Экспортирование переменных для изменения поведения программ.

Часто поведение команд можно изменить установкой переменных окружения. Так же, как в случае новых сессий bash, запускаемые программы из вашей командной строки будут видеть только переменные окружения, помеченные на экспорт. Например, команда man проверяет переменную PAGER, чтобы выяснить какую программу использовать для постраничного просмотра текста.

$ PAGER=less
$ export PAGER
$ man man

Когда переменная PAGER установлена в less, вы будете видеть сначала одну страницу, а нажатие пробела будет перемещать вас а следующую страницу. Если вы измените переменную PAGER в cat, то весь текст отобразится сразу, без остановок на страницах.

$ PAGER=cat
$ man man

Использование «env»

К сожалению, если вы позабудете установить PAGER обратно в less, программа man (как и некоторые другие программы) будет продолжать вывод весь запрошенный текст без остановок. Если вы хотели задать PAGER значение cat только на один раз, то могли бы воспользоваться командой env:

$ PAGER=less
$ env PAGER=cat man man
$ echo $PAGER
less

В этом примере переменная PAGER была использована со значением cat в программе man, но сама по себе переменная окружения PAGER осталась неизменной в сессии bash.

Итоги и ссылки

Итоги

Ну вот самое время поздравить вас с завершением 3-ей части руководства. Вы уже должны знать как находить информацию в системе и интернет документации, а так же иметь хорошее представление о модели прав доступа в Linux, управлении учетными записями пользователей и окружением.

Ссылки

Не забудьте посмотреть ресурсы c Linux документацией, использованные в этом руководстве, в особенности Linux Documentation Project, где сможете найти различные гайды, FAQ, а так же бесценные страницы мана. Не забудьте также о Linux Weekly News.

The Linux System Administrators guide является хорошим дополнением к этому руководству. Также вы можете найти в интернете весьма полезную статью Эрика Рэймонда "Unix and Internet Fundamentals HOWTO".

  • Bash by example, Part 1: Fundamental programming in the Bourne-again shell (перевод планируется)
  • Bash by example, Part 2: More bash programming fundamentals (перевод планируется)
  • Bash by example, Part 3: Exploring the ebuild system. (перевод планируется)

Для знакомства с редактором Emacs, смотрите руководство «the developerWorks», "Living in Emacs".

Продолжение следует.

Об авторах

Daniel Robbins

Дэниэль Роббинс — основатель сообщества Gentoo и создатель операционной системы Gentoo Linux. Дэниэль проживает в Нью-Мехико со свой женой Мэри и двумя энергичными дочерьми. Он также основатель и глава Funtoo, написал множество технических статей для IBM developerWorks, Intel Developer Services и C/C++ Users Journal.

Chris Houser

Крис Хаусер был сторонником UNIX c 1994 года, когда присоединился к команде администраторов университета Тэйлора (Индиана, США), где получил степень бакалавра в компьютерных науках и математике. После он работал во множестве областей, включая веб-приложения, редактирование видео, драйвера для UNIX и криптографическую защиту. В настоящий момент работает в Sentry Data Systems. Крис также сделал вклад во множество свободных проектов, таких как Gentoo Linux и Clojure, стал соавтором книги The Joy of Clojure.

Читайте также: