Created
January 13, 2025 12:11
-
-
Save vladimir-ivanov/e28bb2aeae2002b449f6e571e1d63ba3 to your computer and use it in GitHub Desktop.
bun.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 | |
if [[ $# = 0 ]]; then | |
bun_uri=$github_repo/releases/latest/download/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" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment