Bash: различия между версиями

[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Функция «Добавить ссылку»: добавлено 7 ссылок.
м викификация
Строка 31:
!colspan="2"| Ввод-вывод
|-
| <code>[[echo]]</code> || выводит выражение или содержимое переменной (''stdout''), но имеет ограничения в использовании<ref>Невозможно вывести значение переменной, содержащей <code>-n</code> (в отличие от <code>[[printf]] -- '%s\n' "${переменная}"</code>), т.так к.как <code>-n</code> интерпретируется как параметр команды <code>echo</code>.</ref>
|-
| <code>[[printf]]</code> || команда форматированного вывода, расширенный вариант команды <code>echo</code>
Строка 73:
| <code>exec</code> || заменяет текущий процесс новым, запускаемым командой <code>exec</code>
|-
| <code>shopt</code> || позволяет изменять ключи (опции) оболочки "«на лету"»
|-
!colspan="2"| Команды
Строка 87:
| <code>help ''COMMAND''</code> || выводит краткую справку по использованию внутренней команды ''COMMAND''
|-
!colspan="2"| Управление запущенными в командной оболочке задачами
|-
| <code>jobs</code> || показывает список запущенных в командной оболочке задач либо информацию о конкретной задаче по её номеру
Строка 117:
<source lang="bash">
chmod +rx scriptname # выдача прав на чтение/исполнение любому пользователю
chmod u+rx scriptname # выдача прав на чтение/исполнение только "«владельцу"» скрипта
</source>
 
Строка 169:
 
=== Перенаправление «из кода скрипта» ===
 
Поддерживается [[heredoc-синтаксис]]:
* С интерпретацией переменных и конструкций языка внутри блока:
Строка 229 ⟶ 228 :
 
=== Перенаправление для процесса в целом ===
 
Пример (перенаправление стандартного вывода в файл, запись данных, закрытие файла, сброс stdout):
<source lang="bash">
Строка 260 ⟶ 258 :
 
=== Подстановка вывода команд ===
 
Захват вывода внешних команд:
<source lang="bash">
Строка 479 ⟶ 476 :
Однако при подобном использовании массивов следует быть осторожным ввиду особенностей раскрытия массивов при использовании в качестве индексов специальных символов <code>@</code> и <code>*</code>.
 
Если массив заключён в кавычки и раскрывается с помощью индекса <code>@</code>, то образуется строка из слов, где каждое слово  — отдельный элемент массива. Однако если не заключить раскрытие массива в двойные кавычки, то может получиться совсем другой результат: пробелы, входящие в состав элементов массива, становятся разделителями слов.<syntaxhighlight lang="bash">
args=( -l -a '/home/user/Рабочий стол' )
ls "${args[@]}" # просмотр содержимого каталога '/home/user/Рабочий стол'
Строка 497 ⟶ 494 :
IFS=',' read -r -a array <<< "$text" # правильно (альтернативный вариант с перенаправлением содержимого переменной 'text' в команду 'read')
</syntaxhighlight>
К ошибкам может привести создание массива из текста, полученного в качестве вывода команд или из файла, т.так к.как не только переводы строк, но также и пробелы с символами [[Табуляция|табуляции]] по умолчанию будут считаться разделителями<ref>{{Cite web |url=https://linux.die.net/man/1/bash |title=bash(1): GNU Bourne-Again SHell — Linux man page |publisher=linux.die.net |lang=en |accessdate=2017-07-11}}</ref>.
<syntaxhighlight lang="bash">
array=( "$(ls)" ) # неправильно: пробелы в названии файлов могут разбить имя файла на два элемента массива
Строка 518 ⟶ 515 :
Логическое И обозначается как <code>&amp;&amp;</code>. В операциях проверки условий оператор <code>&&</code> возвращает 0 (success) тогда и только тогда, когда оба операнда имеют значение true (ИСТИНА).
 
Примечание: Возможная путаница в понимании возникает из-за того, что ''команда'' <code>true</code> (и успешное завершение любой команды) завершается с ''кодом возврата'' 0, success (<code>false</code>, наоборот, не 0), в то время как ''логическое значение'' true/false  — отлично от нуля/равно нулю.
 
Примеры:
Строка 559 ⟶ 556 :
</source>
 
Команда <code>((…))</code> также может использоваться в условных утверждениях, так как её исходный параметр  — это 0 или 1, которые могут интерпретироваться как true или false:
<source lang="bash">
if ((VAR == Y * 3 + X * 2))
Строка 575 ⟶ 572 :
 
== Переменные и аргументы ==
 
Аргументы:
{| class="wikitable"
Строка 599 ⟶ 595 :
Встроенные переменные:
{| class="wikitable"
| <code>$BASH</code> || путь к исполняемому файлу bash
|-
| <code>$BASHPID</code> || PID текущего bash * (см. Примечание)
Строка 651 ⟶ 647 :
| <code>$PS3</code> || третичное приглашение, выводится, когда пользователь должен сделать выбор в операторе <code>select</code>
|-
| <code>$PS4</code> || приглашение четвёртого уровня, выводится (в изменённом виде) в начале каждой строки отладочного вывода тогда, когда сценарий вызывается с ключом <code>-x</code>. Обычно отображается как «+», «++» и  т.  д.
|-
| <code>$PWD</code> || рабочий (текущий) каталог
Строка 663 ⟶ 659 :
| <code>$SHLVL</code> || уровень вложенности shell
|}
* Примечание: отличается от $$ при определенных обстоятельствах, таких как подоболочки, которые не требуют повторной инициализации bash.
Пример:
<pre>$ echo $(echo $BASHPID $$) $$ $BASHPID
Строка 714 ⟶ 710 :
== Горячие клавиши ==
* {{key|tab}}: [[Автодополнение]] строки за курсором.
* {{key|Ctrl|!}} {{key|Ctrl|!}}: Повторить последнюю команду.
* {{key|Ctrl|a}}: Перемещает [[курсор]] в начало строки (эквивалентно клавише {{key|Home}}).
* {{key|Ctrl|b}}: Перемещает курсор на один символ назад (эквивалентно клавише {{key|←}}).
* {{key|Ctrl|r}}: Поиск по набранным ранее командам.
* {{key|Ctrl|c}}: Посылает сигнал [[SIGINT]] текущему заданию, который обычно (но не всегда) прекращает и закрывает его.
* {{key|Ctrl|d}}: Посылает маркер [[EOF]], который (если не отключено опцией и текущая строка не содержит текста) закрывает текущую [[Оболочка операционной системы|оболочку]] (эквивалентно команде [[exit]]), при вводе в исполняющуюся программу завершает ввод, если в строке нет текста, иначе завершает строку без символа завершения строки.