Описание тега bash
О Баше
Существует множество интерпретаторов, которые принимают команды в интерактивном режиме или в виде последовательности команд из файла. Борна-снова оболочки (Bash) являются одним из таких интерпретатор. Bash реализует стандартную оболочку Bourne Shell (sh) и предлагает множество дополнений.
Со страницы Bash Фонда свободного программного обеспечения:
Баш - это
sh
-совместимая оболочка, которая включает полезные функции из KornShell (ksh) и оболочки C (csh
). Он предназначен для соответствия стандарту оболочки и инструментов IEEE POSIX P1003.2/ISO 9945.2. Он предлагает функциональные улучшения по сравнению с sh как для программирования, так и для интерактивного использования. Кроме того, большинство сценариев sh можно запускать с помощью Bash без изменений.
Прочтите руководство Bash для получения технических подробностей.
Bash был написан Брайаном Фоксом и впервые выпущен в 1989 году. Это оболочка по умолчанию во многих дистрибутивах Linux и в MacOS; он доступен в большинстве современных операционных систем и перенесен на Windows 10.
Примечание относительно версий
По состоянию на январь 2019 года самая последняя версия bash
5.0, хотя вы можете использовать старую версию в зависимости от вашей операционной системы и обновлений для bash
были установлены. В большинстве установок Linux должно использоваться что-то из семейства 4.x. macOS (ранее Mac OS X) по умолчанию использует версию 3.2 из-за проблем с лицензированием.
Обязательно укажите в своем вопросе, какая версия bash
ты используешь. Это предупредит потенциальных респондентов о том, какие функции вам доступны, а также о том, какие ошибки, возможно, необходимо исправить.
Вы можете определить, какая версия bash
вы используете, запустив bash --version
или проверяя значение BASH_VERSION
переменная оболочки.
Без явной версии ответчик может предположить, что вы используете версию не ниже 4.2. Вопросы с тегамиosx
подразумевается версия 3.2, если не указано иное.
Краткая история выпуска
На основе загрузок с http://ftp.gnu.org/gnu/bash/
Version Release date
=======================
3.2 2006-10-11
4.0 2009-02-20
4.1 2009-12-31
4.2 2011-02-13
4.3 2014-02-26
4.4 2016-09-15
5.0 2019-01-07
Дополнительно все версии для bash
от 2.0 и более поздних версий в сентябре 2014 года был выпущен важный выпуск на уровне исправлений для устранения уязвимости Shellshock.
Прежде чем спрашивать о проблемном коде
Чтобы помочь добрым людям, которые помогают вам, чтобы будущие читатели могли извлечь пользу из вашего вопроса, и чтобы ваш вопрос был признан полезным для этой прекрасной кармы, пожалуйста, сделайте свой вопрос как можно более простым и универсальным:
- Проверьте, есть ли в вашем скрипте или данных символы конца строки в стиле DOS
Использовать
cat -v yourfile
илиecho "$yourvariable" | cat -v
.Возврат каретки DOS будет отображаться как
^M
после каждой строчки.Если вы их найдете, удалите их с помощью
dos2unix
(он жеfromdos
) илиtr -d '\r'
- Убедитесь, что вы запускаете скрипт с
bash
неsh
Первая строка в скрипте должна быть
#!/bin/bash
или#!/usr/bin/env bash
.Не должно быть
#!/bin/sh
Запустите сценарий с
./yourscript
илиbash yourscript
.Не запускайте его с
sh yourscript
.
Это применимо даже тогда, когда sh
символическая ссылка на bash
.
- Найдите небольшой самодостаточный пример.
- Не включайте разделы и команды, не связанные с вашей проблемой.
- Избегайте сложных команд, которые служат только для получения значения (включая значение напрямую).
- Не полагайтесь на внешние файлы. Создавайте файлы на лету, включайте данные напрямую или опубликуйте небольшой пример файла в своем вопросе.
- Проверьте свой пример. Убедитесь, что он работает и по-прежнему показывает проблему. Не отмахивайтесь от этого.
- Переформатирование для наглядности часто позволяет избежать ошибок, связанных с интервалом и именованием.
- Рефакторинг для простоты часто позволяет избежать ошибок, связанных с подоболочками.
- Имитация файлов и данных часто позволяет обойти проблемы, связанные со специальными символами.
- Часы, потраченные на попытки нескольких вещей, часто приводят к публикации кода из одной версии и ошибок из другой.
- Проверьте пример на общие проблемы
- Протестируйте свой пример
shellcheck
или онлайн-сервис shellcheck для автоматической проверки типичных ошибок. - Обзор Bash подводные камни и ошибки новичка в Bash, а также вопросы Популярные ниже раздел перечней общих вопросов.
- Проверьте свои данные на наличие специальных символов, используя
cat -v yourfile
илиcat -v <<< "$yourvar"
. Будьте особенно осторожны с возвратом каретки (показано как^M
).
- Пожалуйста, не помечайте вопросы, касающиеся исключительно внешних команд. В
bash
Тег должен быть зарезервирован для проблем, связанных с Bash, а не для любых проблем с интерфейсом командной строки, которые могут у вас возникнуть.
Как превратить плохой сценарий в хороший вопрос
Например, предположим, что у вас есть сценарий для предупреждения вас, когда сервер простаивает, но он продолжает предупреждать, даже когда машина не простаивает:
# Avoid code like this when asking about a problem
# It has irrelevant code and external dependencies, and is hard to read and run
while true
do
load=$(wget -O - "http://$1/load.php" | grep "^load:" | cut -d: -f 2)
if [[ $load=="0" ]]
then
mailx -s "System is idle" user@example.com <<< "The server is idle"
break
else
echo "Waiting..."
sleep 60
fi
done
- Проблема по-прежнему возникает без цикла: удалите цикл из вашего вопроса.
- Проблема все еще возникает, если вы пропустите запрос сервера: жестко закодируйте ответ (например,
load=42
) - Проблема по-прежнему возникает без отправки по электронной почте: используйте
echo "Why does this run?"
- Проблема все еще возникает при удалении ветки else. Сократите это
Теперь у нас остался этот небольшой самодостаточный пример:
# Prefer code like this when asking about a problem
# It's small, simple and self contained, making it easy to read and run.
load=42
if [[ $load=="0" ]]
then
echo "Why does this run?"
fi
Спасибо за простой и полезный вопрос! Наслаждайтесь своими голосами!
(Однако обратите внимание, что этот пример легко сравнить с соответствующей записью в ловушках Bash, и ошибка автоматически обнаруживаетсяshellcheck
, так что теперь вам не нужно спрашивать!)
Популярные вопросы
Некоторые часто задаваемые вопросы о Bash включают следующее.
Базовый синтаксис и общие проблемы новичков
Некоторые основы Bash удивляют даже ветеранов других языков программирования.
- Запустить текстовый файл как команды в Bash
- Разница между sh и bash
- В чем разница между "./somescript.sh" и "./somescript.sh"
- Ubuntu говорит: "bash: ./program Permission denied"
- Чувствительны ли сценарии оболочки к кодировке и окончанию строки?- громкое да, используйте настоящий редактор, избегайте редактирования файлов сценариев в Windows и / или используйте
dos2unix
- Bash: синтаксическая ошибка: непредвиденное перенаправление и другие ошибки, вызванные запуском
sh
илиdash
вместо тогоbash
- Сценарий Bash печатает "Команда не найдена" в пустых строках, а сценарий оболочки не запущен, команда не найдена - это набор общих проблем новичков, которые приводят к
command not found
сообщение - почему в выражении "if" "then" должно быть в следующей строке в bash?
- Ошибка "команда не найдена" в сценарии bash - не вызывайте собственную переменную
PATH
- Правильное использование заглавных букв в переменных Bash и сценария оболочки
- Глобальные переменные среды в сценарии оболочки, также известные как процессы Unix, не могут изменить свою родительскую среду
- Как добавить вывод в конец текстового файла
- Ошибка команды не найдена в назначении переменной Bash, иначе не может быть пробелов вокруг
=
в присвоении переменных - Назначение переменных через пробел после знака (=)? следствие предыдущего - что это значит, если вокруг есть пробелы
=
в задании? - Операторы равенства Bash ( ==, -eq), также известные как равенство чисел и строк
- Как сравнить две строковые переменные в операторе if в Bash?
- Значение ошибки "[: слишком много аргументов" из if [] (квадратные скобки) aka
[ -f many things ]
не работает - Проверка успешности выполнения команды в операторе bash ʻif [ .. ]` иначе, как вы думаете
[
является частьюif
синтаксис оператора, но это не так - Почему мой оператор if с обратными кавычками не работает должным образом?
- Как я могу проверить, существует ли каталог в сценарии оболочки Bash?
- Длина строки в bash
- Как проверить, содержит ли строка подстроку в Bash
- Простые логические операторы в Bash
- Как мне установить переменную для вывода команды в Bash?
- Прочитать файл построчно, присвоив значение переменной
- здесь-документ выдает ошибку "неожиданный конец файла"
- Как перенаправить и добавить как stdout, так и stderr в файл с помощью Bash?
- Разница между одинарными и двойными кавычками в Bash
- Как использовать переменные в строках с одинарными кавычками?
- Когда заключать переменную оболочки в кавычки?
- Когда нам нужны фигурные скобки вокруг переменных оболочки?
- команда sh read ест обратную косую черту во вводе?
- Как сравнить два числа с плавающей запятой в Bash?
- Как использовать деление с плавающей запятой в bash? иначе Bash не имеет арифметики с плавающей запятой; вам нужно использовать внешнюю утилиту, которая
- Что означает строка "#!/ Bin/sh" в сценарии оболочки UNIX?
- В чем разница между.bashrc, .bash_profile и.environment?
- Что означает 2> в командной строке Unix?
- Что означает " 2>&1 " в оболочке?
- В чем разница между $(command) и `command` в программировании оболочки?
- Разница между одинарными и двойными квадратными скобками в Bash aka
[
против[[
- Список переключателей "если" где-нибудь?- фактически
[
операторыопций- в интерактивном приглашении bash введите
help test
чтобы увидеть их.
- в интерактивном приглашении bash введите
- "синтаксическая ошибка возле неожиданного токена`('"ошибка с подстановкой процесса
Как мне...?
- Как запустить несколько программ параллельно из сценария bash?
- ... но ограничить количество параллельных процессов? Bash-скрипт обрабатывает ограниченное количество команд параллельно
- Как навсегда установить $PATH в Linux/Unix?
- Как отлаживать сценарий bash?
- Создать псевдоним Bash, который принимает параметр?
- Проверить наличие входного аргумента в сценарии оболочки Bash
- Как мне перебрать диапазон чисел, определенных переменными в Bash? ака с использованием переменных в фигурных скобках
- Как удалить суффикс файла и часть пути из строки пути в Bash?
- Как переименовать расширение для группы файлов?
- Переименовать несколько файлов по шаблону в Unix
- Цикл по парам значений в bash - когда вы хотите
mv
илиffmpeg
илиawk
куча пар файлов - Как передать вывод команды в виде нескольких аргументов другой команде
- Как получить исходный каталог сценария Bash из самого сценария?
- Как узнать, что в Bash нет обычного файла?
- Как объединить строковые переменные в Bash
- Как разбить строку по разделителю в Bash?
- Как я могу добавить новую строку в строку в sh?
- Как сохранить символы новой строки в строке в кавычках в Bash?
- Сохранять кавычки в аргументах bash, также как "Как мне вернуть командную строку до того, как были расширены подстановочные знаки" (TL;DR: вы не можете)
- Как использовать переменные оболочки в сценарии awk?
- Использование переменных внутри bash heredoc, а также подстановочных знаков в документах
- Как я могу проверить, существует ли каталог в сценарии оболочки Bash?
- Извлечь имя файла и расширение в Bash
- Как рекурсивно создавать несуществующие подкаталоги с помощью Bash?
- Как мне запросить ввод Да / Нет / Отмена в сценарии оболочки Linux?
- Передача аргументов в интерактивную программу в неинтерактивном режиме
- Остановить расширение подстановочных знаков оболочки?
- Быстрый и грязный способ обеспечить одновременное выполнение только одного экземпляра сценария оболочки
- Как получить pid по имени процесса
- Проверить, содержит ли ошибка команды подстроку
- Разделить один файл на несколько файлов по разделителю
- Как передать аргументы скрипта, содержащие кавычки / пробелы?(т.е. зачем цитировать
"$@"
)? - Как передать произвольные аргументы команде, выполняемой через SSH?
Почему...?
- Последствия для безопасности, если вы забыли указать переменную в кавычках в оболочках bash/POSIX
- Почему /bin/sh ведет себя иначе, чем /bin/bash, даже если один указывает на другой?
- Почему в Bash должны быть пробелы вокруг "[" и "]"? и связанные с ним Почему оператор равенства не работает, если он не окружен пробелом?
- Почему тестирование "$?" чтобы узнать, удалась ли команда или нет, анти-шаблон?
- Соответствие регулярному выражению Bash не работает - экранирование всех специальных символов, также как и не помещайте кавычки в регулярное выражение в
if [[ string =~ $regex ]]
- Регулярное выражение Bash - не может соответствовать ни одному из \s \S \d \D \w \W и т. Д., Иначе говоря, диалект регулярных выражений Bash не PCRE
- Почему я не могу менять каталоги с помощью "cd"?
- Сценарий оболочки при чтении цикла строки останавливается после первой строки
- Переменная, измененная внутри цикла while, не запоминается
- Я только что назначил переменную, но переменная echo $ показывает что-то еще
- Сбой сценария с пробелами в именах каталогов - TL;DR: не читать строки с
for
- Почему оболочка игнорирует символы кавычек в аргументах, переданных ей через переменные? иначе я пытаюсь поместить команду в переменную, но сложные случаи всегда терпят неудачу
- Почему в Bash следует избегать eval и что использовать вместо этого?
- Как использовать значение переменной в качестве имени другой переменной в bash или динамических имен переменных в Bash
- Сообщение об ошибке при запуске Терминала - вы напортачили
.bashrc
или.profile
или похожие. - Как передать аргументы скрипта, содержащие кавычки / пробелы?
- Почему мой код bash не работает, когда я запускаю его с помощью sh?
- Почему тильда (~) не расширяется в двойные кавычки?
- Расширение массива bash дает только первый элемент
- Переменная оболочки доступна в командной строке, но не в скрипте
Общие задачи
Эти вопросы на самом деле не относятся к Bash, но достаточно часто встречаются в этом теге, поэтому их стоит включить здесь.
- Список аргументов слишком длинный: ошибка для команд rm, cp, mv
- Редактирование / замена содержимого в нескольких файлах в Unix AIX без его открытия, то есть поиск / замена по сценариям, поэтому вам не нужно вручную открывать файл и редактировать его
- Быстрый способ найти строки в одном файле, которых нет в другом?
- Удалить определенный номер (а) строки из текстового файла с помощью sed?
- Как удалить повторяющиеся строки в файле без сортировки в Unix?
- Внутреннее соединение двух текстовых файлов
- Заменить поле значениями, указанными в другом файле
- Заменить строку в сценарии оболочки с помощью переменной
- Проверить количество запущенных скриптов с помощью ps
- Получить строку после символа
- Извлечь одно слово после определенного слова в той же строке
- Как получить часть файла после первой строки, которая соответствует регулярному выражению?
- Извлечь строки между двумя токенами в текстовом файле с помощью bash
- Разбор JSON с помощью инструментов Unix
- Фильтрация записей файла журнала по диапазону дат
- Как выполнить рекурсивный поиск / замену строки с помощью awk или sed?
- Передавать команды в качестве входных данных другой команде (su, ssh, sh и т. Д.)
- Как выполнить группу команд от имени другого пользователя в Bash?
- Несколько команд на удаленном компьютере с использованием сценария оболочки
- Как разбить большой текстовый файл на файлы меньшего размера с равным количеством строк?
- CronJob не работает на переполнения стека
crontab
в вики-теге также есть хороший набор примечаний для устранения неполадокcron
проблемы.
Мета
Книги и ресурсы
Дополнительные материалы для чтения включают:
Часто задаваемые вопросы по Bash от текущего основного сопровождающего Чета Рэми.
Bash FAQ от Lhunath
Руководство по Bash от Лхуната
Ускоренный курс командной строки (также справочник по Powershell)
инструменты
-
shellcheck
- инструмент статического анализа, выявляющий типичные ошибки - он-лайн ShellCheck, веб-сервер, обеспечивающий проверку оболочки (полезно, если вы еще не установили программу)
Чат
stackrubash
чат полезен для координации работы в рамках этого тега и, возможно, иногда для получения быстрой помощи (хотя никаких гарантий быть не может; посещаемость невысока).