#!/垃圾桶/垃圾桶#我们不需要“$(command)”的返回码,只需要stdout。#允许`[[-n“$(command)”]]`、`func“$(command)”`、管道等。#shellcheck禁用=SC2312集合-u中止(){打印f“%s\n”“$@”>&2出口1}#不使用bash时,通过简洁的消息快速失败#此处需要单括号以实现POSIX兼容性#外壳检查禁用=SC2292如果[-z“${BASH_VERSION:-}”]然后abort“需要Bash来解释此脚本。”fi(菲涅耳)#检查脚本是否在CI中以强制交互模式运行如果[[-n“${CI-}”&&-n“$1{INTERACTIVE-}“]]然后abort“无法在CI中运行强制交互模式。”fi(菲涅耳)#检查是否同时设置了`INTERACTIVE`和`NONINTERACTIVE`#始终将单引号字符串与“exp”表达式一起使用#shellcheck禁用=SC2016如果[[-n“${INTERACTIVE-}”&&-n“${NONTERACVE-}”]]然后abort“设置了`$INTERACTIVE`和`$NONINTERACTIVE`。请至少取消设置一个变量,然后重试。'fi(菲涅耳)#检查脚本是否在POSIX模式下运行如果[[-n“${POSIXLY_CORRECT+1}”]]然后abort‘Bash不能在POSIX模式下运行。请取消设置POSIXLY_CORRECT,然后重试。'fi(菲涅耳)用法(){猫<${tty_bold}%s${tty重置}\n“”$(shell_join“$@”)“}警告(){打印”${tty_red}警告${tty_reset}:%s\n“”$(chomp“$1”)“>&2}#检查脚本是否以非交互方式运行(例如CI)#如果它是非交互运行的,我们不应该提示输入密码。#始终将单引号字符串与“exp”表达式一起使用#shellcheck禁用=SC2016如果[[-z“${NONINTERACTIVE-}”]]然后如果[[-n“${CI-}”]]然后warn“正在非交互模式下运行,因为设置了`$CI`。”非交互式=1elif[[!-t 0]]然后如果[[-z“${INTERACTIVE-}”]]然后warn“正在非交互模式下运行,因为`stdin`不是TTY。”非交互式=1其他的warn“尽管`stdin`不是TTY,但仍在交互模式下运行,因为设置了`$interactive`。”fi(菲涅耳)fi(菲涅耳)其他的ohai'正在非交互模式下运行,因为设置了`$NONINTERACTIVE`。'fi(菲涅耳)#USER并不总是设置的,因此为安装程序和子流程提供了一个回退。如果[[-z“${USER-}”]]然后USER=“$(chomp”$(id-un)“)”导出用户fi(菲涅耳)#首先检查OS。OS=“$(uname)”如果[[“${OS}”==“Linux”]]然后HOMEBREW_ON_LINUX=1elif[[“${OS}”==“达尔文”]]然后HOMEBREW_ON_MACOS=1其他的abort“Homebrew仅在macOS和Linux上受支持。”fi(菲涅耳)#所需的安装路径。在其他地方安装(不受支持)#你可以解开https://github.com/Homebrew/brew/tarball/master#任何你喜欢的地方。如果[[-n“${HOMEBREW_ON_MACOS-}”]]然后UNAME_MACHINE=“$(/usr/bin/UNAME-m)”如果[[“${UNAME_MACHINE}”==“arm64”]]然后#在ARM macOS上,此脚本仅安装到/opt/homebrewHOMEBREW_PREFIX=“/opt/HOMEBREW”HOMEBREW_REPOSITORY=“${HOMEBREW_PREFIX}”其他的#在Intel macOS上,此脚本仅安装到/usr/localHOMEBREW_PREFIX=“/usr/local”HOMEBREW_REPOSITORY=“${HOMEBREW_PREFIX}/自制”fi(菲涅耳)HOMEBREW_CACHE=“${HOME}/Library/Caches/HOMEBREW”STAT_PRINTF=(“/usr/bin/STAT”“-f”)PERMISSION_FORMAT=“/A”CHOWN=(“/usr/sbin/CHOWN”)CHGRP=(“/usr/bin/CHGRP”)GROUP=“管理员”触摸=(“/usr/bin/TOUCH”)INSTALL=(“/usr/bin/INSTALL”-d-o“root”-g“wheel”-m“0755”)其他的UNAME_MACHINE=“$(UNAME-m)”#在Linux上,此脚本仅安装到/home/linuxbrew/.linuxbrowHOMEBREW_PREFIX=“/home/linuxbrew/.linuxbrow”HOMEBREW_REPOSITORY=“${HOMEBREW_PREFIX}/自制”HOMEBREW_CACHE=“${HOME}/.CACHE/HOMEBREW”STAT_PRINTF=(“/usr/bin/STAT”“--PRINTF”)PERMISSION_FORMAT=“%a”CHOWN=(“/bin/CHOWN”)CHGRP=(“/bin/CHGRP”)GROUP=“$(id-gn)”触摸=(“/bin/TOUCH”)INSTALL=(“/usr/bin/INSTALL”-d-o“${USER}”-g“${GROUP}”-m“0755”)fi(菲涅耳)CHMOD=(“/bin/CHMOD”)MKDIR=(“/bin/MKDIR”“-p”)HOMEBREW_BREW_DEFAULT_GIT_REMOTE=“https://github.com/Homebrew/brew"HOMEBREW_CORE_DEFAULT_GIT_REMOTE=“https://github.com/Homebrew/Homebrew-core"#如果设置了,请使用来自环境的Homebrew存储库的远程URL。HOMEBREW_BREW_GIT_REMOTE=“${HOMEBREW_BREW_MIT_REMOTE:-”${HOMEBREW_BREW_DEFAULT_GIT_EMOTE}“}”HOMEBREW_CORE_GIT_REMOTE=“${HOMEBREW_CORE_GET_REMOTE:-”${HOMEBREW_COR E_DEFAULT_GIT_RETOTE}“}”#后缀为“.git”和不后缀为“.git”的URL是相同的git远程URL。不提示。如果[[“${HOMEBREW_BREW_GIT_REMOTE}”==“${HOMEBREW_BREW_DEFAULT_GIT_REMOTE}.GIT”]]然后HOMEBREW_BREW_GIT_REMOTE=“${HOMEBREW_BREW_DEFAULT_GIT_REMOTE}”fi(菲涅耳)如果[[“${HOMEBREW_CORE_GIT_REMOTE}”==“${HOMEBREW_CORE_DEFAULT_GIT_RETOTE}.GIT”]]然后HOMEBREW_CORE_GIT_REMOTE=“${HOMEBREW_CORE_DEFAULT_GIT_RETOTE}”fi(菲涅耳)导出HOMEBREW_{BREW,CORE}_GIT_REMOTE#TODO:发布或宣布新macOS时的bump版本MACOS_NEWEST_UNSUPPORTED=“15.0”#TODO:发布新macOS时的bump版本MACOS_OLDEST_SUPPORTED=“12.0”#对于Linux上的Homebrew必需_RUBY_VERSION=2.6#https://github.com/Homebrew/brew/pull/6556REQUIRED_GLIBC_VERSION=2.13#https://docs.brew.sh/Homebrew-on-Linux#要求REQUIRED_CURL_VERSION=7.41.0#HOMEBREW_MINIMUM_CURL_FERSION在自制程序/brew中brew.shREQUIRED_GIT_VERSION=2.7.0#HOMEBREW_MINIMUM_GIT_ERSION在自制程序/brew中brew.sh#安装期间无分析导出HOMEBREW_NO_ANALYTICS_THIS_RUN=1导出HOMEBREW_NO_ANALYTICS_MESSAGE_OUTPUT=1unset HAVE_SUDO_ACCESS#从环境中取消设置have_sudo_access(){如果[[!-x“/usr/bin/sudo”]]然后返回1fi(菲涅耳)local-a SUDO=(“/usr/bin/SUDO”)如果[[-n“${SUDO_ASKPASS-}”]]然后SUDO+=(“-A”)elif[[-n“${非交互式-}”]]然后SUDO+=(“-n”)fi(菲涅耳)如果[[-z“${HAVE_SUDO_ACCESS-}”]]然后如果[[-n“${NONINTERACTIVE-}”]]然后“${SUDO[@]}”-l mkdir&>/dev/null其他的“${SUDO[@]}”-v&&“${SUDO[@@]}“-l mkdir&>/dev/nullfi(菲涅耳)HAVE_SUDO_ACCESS=“$?”fi(菲涅耳)如果[[-n“${HOMEBREW_ON_MACOS-}”]]&&[[“${HAVE_SUDO_ACCESS}”-ne 0]]然后abort“在macOS上需要sudo访问权限(例如,用户${user}需要是管理员)!”fi(菲涅耳)return“${HAVE_SUDO_ACCESS}”}执行(){如果!“$@”然后abort“$(printf)失败时间:%s”“$(shell_join”“$@”“)”fi(菲涅耳)}execute_sudo(){local-a args=(“$@”)如果[[“${EUID:-${UID}}”!=“0”]&&have_sudo_access然后如果[[-n“${SUDO_ASKPASS-}”]]然后args=(“-A”“${args[@]}”)fi(菲涅耳)ohai“/usr/bin/sudo”“${args[@]}”执行“/usr/bin/sudo”“${args[@]}”其他的ohai“${args[@]}”执行“${args[@]}”fi(菲涅耳)}获取(){本地存储状态save_state=“$(/bin/stty-g)”/bin/stty原始-echoIFS=''读取-r-n 1-d''“$@”/bin/stty“${save_state}”}铃声(_bell){#使用贝壳的可听铃声。如果[[-t 1]]然后打印f“\a”fi(菲涅耳)}等待用户(){本地c回声echo“按${tty_bold}RETURN${tty_set}/${tty_bold}ENTER${tty_set}继续,或按任何其他键中止:”获取c#我们测试\r,因为有些东西会\r如果![[“${c}”==$'\r'||“${c:”==$'\n']]然后出口1fi(菲涅耳)}主要_次要(){echo“${1%%.*}$(x=“${1#*.}”echo“${x%%.*}”)"}版本_gt(){[[“${1%.*}”-gt“${2%.*}”]]|[[“${1%.*}”-eq“${2%.*}”&&“${1#*.}”-gt“${2#*.}”]]}版本_ ge(){[[“${1%.*.}”-gt“${2%.*}”]|[[“$1{1%..*}“-eq”${2%..*}“&&”${1#*.}“-ge”${2#*.}“]]}版本_lt(){[[“${1%.*}”-lt“${2%.*}”]||[“$}1%.*.}”-eq“${2%.*{”&&“${1#*.}“-lt”${2#*.}”]]}检查运行命令as_root(){[[“${EUID:-${UID}}”==“0”]]||return#允许Azure Pipelines/GitHub Actions/Docker/Concourse/Kubernetes以root身份执行所有操作(在那里很正常)[[-f/.dockerenv]]&&返回[[-f/run/.containerenv]]&&返回[[-f/proc/1/cgroup]]&&grep-E“azpl_job|actions_job| docker | garden | kubepods”-q/proc/1/cgroup&&returnabort“不要以root身份运行!”}应安装命令行工具(){如果[[-n“${HOMEBREW_ON_LINUX-}”]]然后返回1fi(菲涅耳)如果版本gt“${macosversion}”“10.13”然后! [[-e“/Library/Developer/CommandLineTools/usr/bin/git”]]其他的! [[-e“/Library/Developer/CommandLineTools/usr/bin/git”]]||! [[-e“/usr/include/iconv.h”]]fi(菲涅耳)}获取权限(){“${STAT_PRINTF[@]}”“${PERMISSION_FORMAT}”}user_only_chmod(){[[-d“$1”]]&[[“$(get_permission”$1“)”!=75[0145]]]}exists_but_not_writable(){[[-e“1美元”]&&![[-r“$1”&&-w“$1“&&-x”$1“]]}获取所有者(_O){“${STAT_PRINTF[@]}”“%u”“$1”}文件未拥有(){[[“$(get_owner”$1“)”!=“$(id-u)”]]}获取组(){“${STAT_PRINTF[@]}”“%g”“$1”}文件未添加(){[[“$(id-G”${USER}“)”!=*“$(get_group“$1”)”*]]}#请与Homebrew/brew存储库中的“Library/Homebrows/utils/ruby.sh”中的“test_ruby()”同步。测试_鲁比(){如果[[!-x“$1”]]然后返回1fi(菲涅耳)“$1”--启用冻结字符串文字--disable=gems,did_you_mean,rubypt-rrubygems-e\“如果Gem::Version.new(RUBY_Version.to_s.dup).to_s.split('.').first(2),则中止!=\Gem::Version.new('${REQUIRED_RUBY_Version}').to_s.split('.').first(2)“2>/dev/null}测试曲线(){如果[[!-x“$1”]]然后返回1fi(菲涅耳)本地curl_version_output curl_name_and_versioncurl_version_output=“$(”$1“--version 2>/dev/null)”curl_name_and_version=“${curl_version_output%%(*}”版本_ge“$(主要_次要”${curl_name_and_version##*}“)”“$(重要_次要“${REQUIRED_curl_version}”)”}测试git(){如果[[!-x“$1”]]然后返回1fi(菲涅耳)本地git版本输出git_version_output=“$(”$1“--version 2>/dev/null)”如果[[“${git_version_output}”=~“git-version”([^]*).*]]然后版本_ge“$(主_minor”${BASH_REMATCH[1]}“)”“$(主要_minor“${REQUIRED_GIT_version}”)”其他的abort“意外的Git版本:'${Git_version_output}'!”fi(菲涅耳)}#在PATH中搜索给定的可执行文件(避免依赖于`which`命令)which(){#Bash内置命令的别名`type-P`类型-P“$@”}#在PATH中搜索满足Homebrew要求的指定程序#上面设置的功能#外壳检查禁用=SC2230查找工具(){如果[[$#-ne 1]]然后返回1fi(菲涅耳)本地可执行文件读取-r可执行文件时if[[“${executable}”!=/*]]然后警告“忽略${executable}(相对路径无效)”elif“test_$1”“${executable}”然后echo“${executable}”打破fi(菲涅耳)完成<<(其中-“1美元”)}无可用(_usable_ruby){[[-z“$(查找工具ruby)”]]}过时_glibc(){本地glibc_versionglibc_version=“$(ldd--版本|head-n1|grep-o'[0-9.]*$‘|grep-o’^[0-9]\+\.[0-9]\\+')”version_lt“${glibc_version}”“${REQUIRED_glibc_version}”}如果[[-n“${HOMEBREW_ON_LINUX-}”]&&no_usable_ruby&&outdated_glibc然后中止”$(猫</开发/空然后trap“/usr/bin/sudo-k”退出fi(菲涅耳)#如果“pwd”不存在,以后可能会失败。#此外,sudo无缘无故地打印警告消息cd“/usr”||退出1#######################################################################脚本#shellcheck禁用=SC2016ohai'正在检查“sudo”访问权限(可能会请求您的密码)…'如果[[-n“${HOMEBREW_ON_MACOS-}”]]然后[[“${EUID:-${UID}}”==“0”]]||have_sudo_access埃利夫![[-w“${HOMEBREW_PREFIX}”]]&&! [[-w“/home/linuxbrew”]]&&! [[-w“/home”]]&&! 拥有sudo_access然后中止”$(猫</开发/空然后中止”$(猫</dev/null返回#我们分四步完成,以避免在重新安装时出现合并错误执行“${USABLE_GIT}”“-c”“init.defaultBranch=master”“init”“--quiet”#如果在全局配置中定义了远程,则“git remote add”将失败执行“${USABLE_GIT}”“config”“remote.origin.url”“${HOMEBREW_BREW_GIT_remote}”执行“${USABLE_GIT}”“config”“remote.origin.fetch”“+refs/heads/*:refs/remotes/origin/*”#确保我们在结账时不会咀嚼行尾执行“${USABLE_GIT}”“config”“--bool”“core.autoslf”“false”#确保符号链接保存为-is执行“${USABLE_GIT}”“config”“--bool”“core.symlinks”“true”执行“${USABLE_GIT}”“fetch”“--force”“origin”执行“${USABLE_GIT}”“fetch”“--force”“--tags”“origin”执行“${USABLE_GIT}”“remote”“set-head”“origin”“--auto”>/dev/nullLATEST_GIT_TAG=“$(”${USABLE_GIT}“标记--list--sort=”-version:refname“|head-n1)”如果[[-z“${LATEST_GIT_TAG}”]]然后abort“查询最新Homebrew/brew Git标记失败。”fi(菲涅耳)执行“${USABLE_GIT}”“checkout”“--force”“-B”“stable”“${LATEST_GIT_TAG}”如果[[“${HOMEBREW_REPOSITORY}”!=“${HOMEBREW_PREFIX}”]]然后如果[[“${HOMEBREW_REPOSITORY}”==“${HOMEBREW_PREFIX}/自制”]]然后执行“ln”“-sf”“../Homebrew/bin/brew”“${Homebrew_PREFIX}/bin/bree”其他的abort“Homebrew/brew存储库应放置在Homebrow前缀目录中。”fi(菲涅耳)fi(菲涅耳)如果[[-n“${HOMEBREW_NO_INSTALL_FROM_API-}”&&!-d“$[{HOMEBREW_CORE}”]]然后#始终将单引号字符串与“exp”表达式一起使用#shellcheck禁用=SC2016ohai'点击自制软件/core,因为设置了`$homebrew_NO_INSTALL_FROM_API`。'(执行“${MKDIR[@]}”“${HOMEBREW_CORE}”cd“${HOMEBREW_CORE}”>/dev/null||return执行“${USABLE_GIT}”“-c”“init.defaultBranch=master”“init”“--quiet”执行“${USABLE_GIT}”“config”“remote.origin.url”“${HOMEBREW_CORE_GIT_remote}”执行“${USABLE_GIT}”“config”“remote.origin.fetch”“+refs/heads/*:refs/remotes/origin/*”执行“${USABLE_GIT}”“config”“--bool”“core.autoslf”“false”执行“${USABLE_GIT}”“config”“--bool”“core.symlinks”“true”执行“${USABLE_GIT}”“fetch”“--force”“origin”“refs/heads/master:refs/remotes/origin/master”执行“${USABLE_GIT}”“remote”“set-head”“origin”“--auto”>/dev/null执行“${USABLE_GIT}”“reset”“--hard”“origin/master”cd“${HOMEBREW_REPOSITORY}”>/dev/null||return)||退出1fi(菲涅耳)执行“${HOMEBREW_PREFIX}/bin/brew”“update”“--force”“--quiet”)||退出1如果[[“:${PATH}:”!=*“:$}HOMEBREW_PREFIX}/bin:”*]]然后警告“${HOMEBREW_PREFIX}/bin不在您的路径中。关于如何为Homebrew配置外壳的说明可以在下面的“下一步”部分中找到。"fi(菲涅耳)ohai“安装成功!”回声铃声#使用额外的换行符和粗体以避免遗漏。ohai“Homebrew已经启用了匿名聚合公式和木桶分析。”回声”$(猫</dev/null返回执行“${USABLE_GIT}”“config”“--替换所有”“homebrew.analyticsmessage”“true”执行“${USABLE_GIT}”“config”“--replace-all”“homebrew.caskanalyticsmessage”“true”)||退出1ohai“下一步:”中的案例“${SHELL}”*/猛击*)如果[[-n“${HOMEBREW_ON_LINUX-}”]]然后shell_rcfile=“${HOME}/.bashrc”其他的shell_rcfile=“${HOME}/.bash_profile”fi(菲涅耳);;*/zsh*)如果[[-n“${HOMEBREW_ON_LINUX-}”]]然后shell_rcfile=“${ZDOTDIR:-”${HOME}“}/.zshrc”其他的shell_rcfile=“${ZDOTDIR:-”${HOME}“}/.zprofile”fi(菲涅耳);;*/鱼*)shell_rcfile=“${HOME}/.config/fish/config.fish”;;*)shell_rcfile=“${ENV:-”${HOME}/.profile“}”;;欧洲安全理事会if grep-qs“eval\”\$(${HOMEBREW_PREFIX}/bin/brew shellenv)\“”“${shell_rcfile}”然后如果![[-x“$(命令-v brew)”]]然后猫<>${shell_rcfile}eval“\$(${HOMEBREW_PREFIX}/bin/brew shellenv)”EOS公司fi(菲涅耳)如果[[-n“${non-default_repos}”]]然后复数=“”如果[[“${#additional_shellenv_commands[@]}”-gt 1]]然后复数=“s”fi(菲涅耳)printf--“-在终端中运行这些命令,为%s添加非默认Git远程%s:\n”“${复数}”“$}non_default_repos}”printf“echo”#为Homebrew设置PATH、MANPATH等。'>>%s\n“”${shell_rcfile}“printf“echo'%s'>>${shell_rcfile}\n”“${additional_shellenv_commands[@]}”printf“%s\n”“${additional_shellenv_commands[@]}”fi(菲涅耳)如果[[-n“${HOMEBREW_ON_LINUX-}”]]然后echo“-如果您有sudo访问权限,请安装Homebrew的依赖项:”如果[[-x“$(command-v apt-get)”]]然后echo“sudo apt-get安装build-essential”elif[[-x“$(command-v yum)”]]然后echo“sudo yum groupinstall‘开发工具’”elif[[-x“$(命令-v pacman)”]]然后echo“sudo pacman-S基本级别”elif[[-x“$(命令-v apk)”]]然后echo“sudo apk add build-base”fi(菲涅耳)猫<-->