123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- #!/usr/bin/env bash
- set -euo pipefail
- platform=$(uname -ms)
- if [[ ${OS:-} = Windows_NT ]]; then
- if [[ $platform != MINGW64* ]]; then
- powershell -c "irm bun.sh/install.ps1|iex"
- exit $?
- fi
- fi
- # Reset
- Color_Off=''
- # Regular Colors
- Red=''
- Green=''
- Dim='' # White
- # Bold
- Bold_White=''
- Bold_Green=''
- if [[ -t 1 ]]; then
- # Reset
- Color_Off='\033[0m' # Text Reset
- # Regular Colors
- Red='\033[0;31m' # Red
- Green='\033[0;32m' # Green
- Dim='\033[0;2m' # White
- # Bold
- Bold_Green='\033[1;32m' # Bold Green
- Bold_White='\033[1m' # Bold White
- fi
- error() {
- echo -e "${Red}error${Color_Off}:" "$@" >&2
- exit 1
- }
- info() {
- echo -e "${Dim}$@ ${Color_Off}"
- }
- info_bold() {
- echo -e "${Bold_White}$@ ${Color_Off}"
- }
- success() {
- echo -e "${Green}$@ ${Color_Off}"
- }
- command -v unzip >/dev/null ||
- error 'unzip is required to install bun'
- if [[ $# -gt 2 ]]; then
- error 'Too many arguments, only 2 are allowed. The first can be a specific tag of bun to install. (e.g. "bun-v0.1.4") The second can be a build variant of bun to install. (e.g. "debug-info")'
- fi
- case $platform in
- 'Darwin x86_64')
- target=darwin-x64
- ;;
- 'Darwin arm64')
- target=darwin-aarch64
- ;;
- 'Linux aarch64' | 'Linux arm64')
- target=linux-aarch64
- ;;
- 'MINGW64'*)
- target=windows-x64
- ;;
- 'Linux x86_64' | *)
- target=linux-x64
- ;;
- esac
- case "$target" in
- 'linux'*)
- if [ -f /etc/alpine-release ]; then
- target="$target-musl"
- fi
- ;;
- esac
- if [[ $target = darwin-x64 ]]; then
- # Is this process running in Rosetta?
- # redirect stderr to devnull to avoid error message when not running in Rosetta
- if [[ $(sysctl -n sysctl.proc_translated 2>/dev/null) = 1 ]]; then
- target=darwin-aarch64
- info "Your shell is running in Rosetta 2. Downloading bun for $target instead"
- fi
- fi
- GITHUB=${GITHUB-"https://github.com"}
- github_repo="$GITHUB/oven-sh/bun"
- # If AVX2 isn't supported, use the -baseline build
- case "$target" in
- 'darwin-x64'*)
- if [[ $(sysctl -a | grep machdep.cpu | grep AVX2) == '' ]]; then
- target="$target-baseline"
- fi
- ;;
- 'linux-x64'*)
- # If AVX2 isn't supported, use the -baseline build
- if [[ $(cat /proc/cpuinfo | grep avx2) = '' ]]; then
- target="$target-baseline"
- fi
- ;;
- esac
- exe_name=bun
- if [[ $# = 2 && $2 = debug-info ]]; then
- target=$target-profile
- exe_name=bun-profile
- info "You requested a debug build of bun. More information will be shown if a crash occurs."
- fi
- bun_version=BUN_VERSION
- if [[ $# = 0 ]]; then
- bun_uri=$github_repo/releases/download/bun-v$bun_version/bun-$target.zip
- else
- bun_uri=$github_repo/releases/download/$1/bun-$target.zip
- fi
- install_env=BUN_INSTALL
- bin_env=\$$install_env/bin
- install_dir=${!install_env:-$HOME/.bun}
- bin_dir=$install_dir/bin
- exe=$bin_dir/bun
- if [[ ! -d $bin_dir ]]; then
- mkdir -p "$bin_dir" ||
- error "Failed to create install directory \"$bin_dir\""
- fi
- curl --fail --location --progress-bar --output "$exe.zip" "$bun_uri" ||
- error "Failed to download bun from \"$bun_uri\""
- unzip -oqd "$bin_dir" "$exe.zip" ||
- error 'Failed to extract bun'
- mv "$bin_dir/bun-$target/$exe_name" "$exe" ||
- error 'Failed to move extracted bun to destination'
- chmod +x "$exe" ||
- error 'Failed to set permissions on bun executable'
- rm -r "$bin_dir/bun-$target" "$exe.zip"
- tildify() {
- if [[ $1 = $HOME/* ]]; then
- local replacement=\~/
- echo "${1/$HOME\//$replacement}"
- else
- echo "$1"
- fi
- }
- success "bun was installed successfully to $Bold_Green$(tildify "$exe")"
- if command -v bun >/dev/null; then
- # Install completions, but we don't care if it fails
- IS_BUN_AUTO_UPDATE=true $exe completions &>/dev/null || :
- echo "Run 'bun --help' to get started"
- exit
- fi
- refresh_command=''
- tilde_bin_dir=$(tildify "$bin_dir")
- quoted_install_dir=\"${install_dir//\"/\\\"}\"
- if [[ $quoted_install_dir = \"$HOME/* ]]; then
- quoted_install_dir=${quoted_install_dir/$HOME\//\$HOME/}
- fi
- echo
- case $(basename "$SHELL") in
- fish)
- # Install completions, but we don't care if it fails
- IS_BUN_AUTO_UPDATE=true SHELL=fish $exe completions &>/dev/null || :
- commands=(
- "set --export $install_env $quoted_install_dir"
- "set --export PATH $bin_env \$PATH"
- )
- fish_config=$HOME/.config/fish/config.fish
- tilde_fish_config=$(tildify "$fish_config")
- if [[ -w $fish_config ]]; then
- {
- echo -e '\n# bun'
- for command in "${commands[@]}"; do
- echo "$command"
- done
- } >>"$fish_config"
- info "Added \"$tilde_bin_dir\" to \$PATH in \"$tilde_fish_config\""
- refresh_command="source $tilde_fish_config"
- else
- echo "Manually add the directory to $tilde_fish_config (or similar):"
- for command in "${commands[@]}"; do
- info_bold " $command"
- done
- fi
- ;;
- zsh)
- # Install completions, but we don't care if it fails
- IS_BUN_AUTO_UPDATE=true SHELL=zsh $exe completions &>/dev/null || :
- commands=(
- "export $install_env=$quoted_install_dir"
- "export PATH=\"$bin_env:\$PATH\""
- )
- zsh_config=$HOME/.zshrc
- tilde_zsh_config=$(tildify "$zsh_config")
- if [[ -w $zsh_config ]]; then
- {
- echo -e '\n# bun'
- for command in "${commands[@]}"; do
- echo "$command"
- done
- } >>"$zsh_config"
- info "Added \"$tilde_bin_dir\" to \$PATH in \"$tilde_zsh_config\""
- refresh_command="exec $SHELL"
- else
- echo "Manually add the directory to $tilde_zsh_config (or similar):"
- for command in "${commands[@]}"; do
- info_bold " $command"
- done
- fi
- ;;
- bash)
- # Install completions, but we don't care if it fails
- IS_BUN_AUTO_UPDATE=true SHELL=bash $exe completions &>/dev/null || :
- commands=(
- "export $install_env=$quoted_install_dir"
- "export PATH=\"$bin_env:\$PATH\""
- )
- bash_configs=(
- "$HOME/.bashrc"
- "$HOME/.bash_profile"
- )
- if [[ ${XDG_CONFIG_HOME:-} ]]; then
- bash_configs+=(
- "$XDG_CONFIG_HOME/.bash_profile"
- "$XDG_CONFIG_HOME/.bashrc"
- "$XDG_CONFIG_HOME/bash_profile"
- "$XDG_CONFIG_HOME/bashrc"
- )
- fi
- set_manually=true
- for bash_config in "${bash_configs[@]}"; do
- tilde_bash_config=$(tildify "$bash_config")
- if [[ -w $bash_config ]]; then
- {
- echo -e '\n# bun'
- for command in "${commands[@]}"; do
- echo "$command"
- done
- } >>"$bash_config"
- info "Added \"$tilde_bin_dir\" to \$PATH in \"$tilde_bash_config\""
- refresh_command="source $bash_config"
- set_manually=false
- break
- fi
- done
- if [[ $set_manually = true ]]; then
- echo "Manually add the directory to $tilde_bash_config (or similar):"
- for command in "${commands[@]}"; do
- info_bold " $command"
- done
- fi
- ;;
- *)
- echo 'Manually add the directory to ~/.bashrc (or similar):'
- info_bold " export $install_env=$quoted_install_dir"
- info_bold " export PATH=\"$bin_env:\$PATH\""
- ;;
- esac
- echo
- info "To get started, run:"
- echo
- if [[ $refresh_command ]]; then
- info_bold " $refresh_command"
- fi
- info_bold " bun --help"
|