Машинный перевод, ручная вычитка, если есть ошибки, добро пожаловать на их исправление Оригинальный адрес:Upgrading Bash on macOS
Одна вещь, о которой не знают многие пользователи macOS, заключается в том, что они используют полностью устаревшую версию оболочки Bash. так,сильныйДля macOS рекомендуется использовать более новую версию Bash, так как в ней доступно много новых функций. В этой статье описано, как это сделать.
Версия Bash по умолчанию в macOS
Чтобы узнать, не устарела ли версия Bash, включенная в macOS, выполните следующую команду:
$ bash --version
GNU bash,版本 3.2.57(1)-release (x86_64-apple-darwin19.0.0)
Copyright (C) 2017 Free Software Foundation, Inc.
许可证 GPLv3+: GNU GPL 许可证第三版或者更新版本 <http://gnu.org/licenses/gpl.html>
本软件是自由软件,你可以自由地更改和重新发布。
在法律许可的情况下特此明示,本软件不提供任何担保。
Как видите, этоGNU Bash 3.2издание, датированное2007 г.! Эта версия Bash включена ввсеверсия macOS или даже последняя версия.
Причина, по которой Apple включает такую старую версию Bash в свою операционную систему, связана сСвязанные с лицензированием. Начиная с версии 4.0 (преемник 3.2), Bash используетСтандартная общественная лицензия GNU v3 (GPLv3), который Apple не поддерживает (не хочет). Ты сможешьздесьиздесьузнать об этомпроблеманекоторые обсуждения. Версия 3.2 GNU Bash — это последняя версия, принятая Apple с GPLv2, так что придерживайтесь этой версии.
Это означает, что весь мир (например, Linux) будет использовать новую версию Bash, а пользователи macOS смогут использовать только старую версию десятилетней давности. На момент написания этой статьи последняя версия GNU Bash — 5.0 (см.здесь), опубликованный в январе 2019 года. В этой статье я даю инструкции по обновлению стандартной оболочки вашей системы до последней версии Bash.
Зачем обновлять?
Но если Bash 3.2 работает нормально, зачем обновляться до более новой версии? Лично для меня основная причиназавершение программирования. Новой функцией Bash является поддержка автодополнения для определенных команд. Вы можете использовать автодополнение для команд, имен файлов и переменных, набрав, а затем набравКлавиша табуляциидля автодополнения текущего слова (или два нажатияКлавиша табуляциичтобы получить список всех возможных завершений, если их больше одного) ). Это автозаполнение Bash.
но,завершение программированияБолее того, он позволяет выполнять контекстно-зависимое завершение команды. Например, представьте, что вы вводитеcmd -[tab][tab]
и просмотреть список всех параметров, доступных для команды. или введитеcmd host rm [tab][tab]
Затем просмотрите список всех «хостов», указанных в файле конфигурации.завершение программированияМогу сделать это.
Программируемая логика завершения (создателем команды) определяется в спецификации завершения, обычно начиная сзавершить сценарийопределение формы. Эти сценарии завершения должны быть предоставлены в оболочке, чтобы включить завершение команд.
Проблема в том, что функции программируемого завершения Bash были расширены, начиная с версии 3.2, и большинство сценариев завершения используют эти новые функции. Это означает, что эти сценарии завершения не будут работать в Bash 3.2, а это означает, что если вы продолжите использовать оболочку macOS по умолчанию, вы пропустите завершение многих команд.
При обновлении до более новой версии Bash вы можете использовать эти сценарии завершения, которые могут быть очень полезными. Я написал целую статью под названиемЗавершение программирования Bash на macOS, который покрывает все, что вам нужно знать, чтобы воспользоваться программируемым завершением MacOS после обновления до более новой версии Bash.
Как обновить?
Чтобы обновить оболочку вашей системы macOS по умолчанию до последней версии Bash, вы должны сделать три вещи:
- Установите последнюю версию Bash
- использовать новый белый список Bash» в качестве оболочки для входа в систему
- Установите новый Bash в качестве оболочки по умолчанию
Каждый шаг очень прост, как описано ниже.
** Примечание: ** Следующее описание не изменяет старые версии Bash, а устанавливает новую версию и устанавливает ее в качестве версии по умолчанию. Обе версии будут сосуществовать в вашей системе, но вы можете игнорировать старую версию отсюда.
Установить
я рекомендую использоватьHomebrewУстановите последнюю версию Bash:
варить установить баш
Вот и все!
Чтобы проверить установку, вы можете убедиться, что в вашей системе теперь есть две версии Bash:
$ which -a bash
/usr/local/bin/bash
/bin/bash
Первая новая версия, вторая - старая версия:
$ /usr/local/bin/bash --version
GNU bash, version 5.0.0(1)-release (x86_64-apple-darwin18.2.0)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
существуетPATH
переменная, новая версия по умолчанию/usr/local/bin
Путь к каталогу будет в старой версии/bin
каталог, так что просто введитеbash
Новая версия готова к использованию
$ bash --version
GNU bash, version 5.0.0(1)-release (x86_64-apple-darwin18.2.0)
Все идет нормально. Теперь вы установили эту версию по умолчанию.
белый список
UNIX включает в себя функцию безопасности, которая будет доступна какlogin shellОболочки (то есть оболочка, используемая после входа в систему) ограничены списком «доверенных» оболочек. Эти снаряды в[/etc/shells](https://bash.cyberciti.biz/guide//etc/shells)
указан в файле.
Поскольку вы собираетесь использовать только что настроенную оболочку Bash в качестве оболочки по умолчанию, она должна действовать как оболочка входа в систему. Это означает, что вы должны добавить его в/etc/shells
в файле. Вы можете редактировать этот файл как root:
$ sudo vim /etc/shells
и воля/usr/local/bin/bash
Shell добавляется в его содержимое, так что файл выглядит так:
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/bash
Вот что нужно сделать на этом шаге!
установить оболочку по умолчанию
На этом этапе, если вы откроете новое окно терминала, Bash 3.2 все еще будет использоваться. Это потому что/bin/bash
По-прежнему устанавливается в качестве оболочки по умолчанию. Чтобы изменить его на новую оболочку, выполните следующую команду:
$ chsh -s /usr/local/bin/bash
Вот и все, оболочка текущего пользователя по умолчанию теперь настроена на новую версию Bash. Если вы закроете и снова откроете окно терминала, теперь вы должны использовать новую версию. Вы можете проверить следующим образом:
$ echo $BASH_VERSION
5.0.0(1)-release
Долженchsh
Команда только изменяет оболочку по умолчанию для пользователя, выполняющего команду (текущего пользователя). Если вы также хотите изменить оболочку по умолчанию для других пользователей, вы можете сделать это, войдя в систему как другой пользователь (например, используя[su](https://en.wikipedia.org/wiki/Su_(Unix))
), чтобы повторить команду. Кроме того, возможно, вы захотите изменить оболочку по умолчанию для пользователя root, вы можете сделать следующее:
$ sudo chsh -s /usr/local/bin/bash
Таким образом, если выsudo su
Откройте оболочку с правами root, и она будет использовать новую версию Bash.
Важные заметки
Использование в сценарии
Как упоминалось ранее, вы не меняете версию Bash по умолчанию, а устанавливаете новую версию и устанавливаете ее как версию по умолчанию. В вашей системе сосуществуют две версии Bash:
-
/bin/bash
: старая версия -
/usr/local/bin/bash
: новая версия
В сценариях оболочки у вас часто будетshebangстроку, как показано в следующем скрипте:
#!/bin/bash
echo $BASH_VERSION
Важно отметить, что линия ШебангачистыйБаш процитировалСтарыйверсия (поскольку она указывает/bin/bash
). Это означает, что если вы запустите этот скрипт, он будет интерпретирован более старыми версиями Bash (вы можете увидеть это в выводе скрипта, что-то вроде3.2.57(1)-release
).
В большинстве случаев это не может быть проблемой. Однако, если вы хотите, чтобы сценарий былновыйверсия Bash явно интерпретируется, вы можете изменить строку shebang следующим образом:
#!/usr/local/bin/bash
echo $BASH_VERSION
Текущий выход будет5.0.0(1)-release
. Однако обратите внимание, что решениенепортативный, что означает, что он может не работать в других системах. Это связано с тем, что в других системах может не быть оболочки./usr/local/bin/bash
(и/bin/bash
Это почти стандарт).
Комбинируйте лучшие из обоих миров, вы можете использовать следующую линию Shebang:
$ sudo rm /bin/bash
$ sudo ln -s /usr/local/bin/bash /bin/bash
Для линии Shebang эторекомендуемыеФормат. он проходит проверкуPATH
и использовать первое попавшеесяbash
Исполняемые файлы работают как интерпретаторы сценариев. Если каталог новой версии находится в каталоге старой версииPATH
(по умолчанию), будет использоваться новая версия, и вывод скрипта будет примерно таким5.0.0(1)-release
.
Почему я не могу использовать символические ссылки?
Чтобы не иметь дело с двумя версиями Баша, можно ли удалить старую версию и поставить новую на старое место? Например, по/bin/bash
где создать симлинк на новую версию вот так?
$ sudo rm /bin/bash
$ sudo ln -s /usr/local/bin/bash /bin/bash
Таким образом, даже скрипт со скриптом#!/bin/bash
также будет интерпретироваться более новыми версиями Bash, так почему бы и нет?
Вы можете сделать это, но вы должны избегать, какЗащита целостности системы (SIP)** ** (Wikipedia) функций безопасности macOS. Эта функция даже запрещает пользователю root иметь доступ на запись к определенным каталогам (поэтому ее также называют «без root»). Эти каталоги находятся вздесьперечислить и включить/bin
. Это означает, что даже будучи пользователем root, вы не можете выполнить приведенную выше команду, поскольку вам не разрешено ничего удалять из нее или в/bin
Создайте любой файл в.
Обходной путь - отключить SIP, в/bin
, а затем снова включите SIP. может основываться наздесьИнструкция по включению и отключению SIP. он просит вас загрузить компьютер, чтобырежим восстановления, затем используйтеcsrutil disable
иcsrutil enable
Заказ.无论你想通过这个особенно сложныйполностью заменить старую версию Bash или согласиться на использование обеих версий Bash одновременно, решать вам.