Skip to content

Instantly share code, notes, and snippets.

@OhYee
Last active March 23, 2025 12:34
Show Gist options
  • Save OhYee/87228bbce831b4b7027e3d6407e7b2f8 to your computer and use it in GitHub Desktop.
Save OhYee/87228bbce831b4b7027e3d6407e7b2f8 to your computer and use it in GitHub Desktop.
echo '
# install the script
curl -o ${HOME}/.bashrc \
-k \
"http://proxy.ohyee.cc/gist.githubusercontent.com/OhYee/87228bbce831b4b7027e3d6407e7b2f8/raw/.bashrc" && \
source ~/.bashrc && \
init_bash
' >>/dev/null
# If not running interactively, don't do anything
[[ $- != *i* ]] && return
if [[ "$0" == *bash ]]; then
# PS1
export PS1='$(if [ $? -eq 0 ]; then echo -ne "\[\e[1;32m\]$\[\e[0m\]"; else echo -ne "\[\e[1;31m\]$\[\e[0m\]"; fi) \[\e[95m\]\t\[\e[0m\] \[\e[33m\]\u\[\e[0m\]@$([[ -e /.dockerenv ]] && echo -e "\e[1;34;1mContainer\e[0m-")\[\e[36m\]\H\[\e[0m\]$([ -n "$MACHINE_NAME" ] && echo -e "(\033[1;32m$MACHINE_NAME\033[0m)"):\[\e[34m\]\w\[\e[0m\]$(branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null);if [[ -n ${branch} ]]; then echo -ne "@\[\e[1;91m\]${branch}\[\e[0m\]";fi)$(COMMIT=$(git rev-parse --short HEAD 2>>/dev/null); [ -n "$COMMIT" ] && echo -e "(\033[2;31m$COMMIT\033[0m)" ) \[\e[1;37m\]\n>\[\e[0m\] '
export PS4='+ \e[34;1m[DEBUG]\e[0m $SHLVL/$BASH_SUBSHELL \e[34;2m./$BASH_SOURCE:$LINENO$([[ -n $FUNCNAME ]] && echo -n " ${FUNCNAME}()" )\e[0m '
export PS1="$PS1"'\[\e]1337;CurrentDir=$(pwd)\a\]'
fi
# PATH
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin
export PATH=${HOME}/.local/bin:$PATH
export PATH=${HOME}/.cargo/bin:$PATH
export PATH=${HOME}/go/bin:$PATH
export PATH=${HOME}/.yarn/bin:$PATH
export PATH=${HOME}/usr/bin:$PATH
export ENV_FOLDER=${HOME}/env
export OPT_ENV_FOLDER=/opt
mkdir -p $ENV_FOLDER
export PATH=$ENV_FOLDER/bin:$OPT_ENV_FOLDER/bin:$PATH
for folder in $(ls -al $OPT_ENV_FOLDER | grep "^l" | tr -s " " | cut -d " " -f 9); do
export PATH=$opt/$folder/bin:$PATH
done
for folder in $(ls -al $ENV_FOLDER | grep "^l" | tr -s " " | cut -d " " -f 9); do
export PATH=$ENV_FOLDER/$folder/bin:$PATH
done
# 清除重复的 PATH,保留顺序
export PATH=$(echo $PATH | tr ':' '\n' | cat -n | sort -k2,2 -k1,1n | uniq -f1 | sort -k1,1n | cut -f2- | tr '\n' ':')
# vscode terminal shell integration
if [[ "$TERM_PROGRAM" == "vscode" ]] && [[ -n "$(command -v __vsc_prompt_cmd 2>/dev/null)" ]]; then
export PROMPT_COMMAND=__vsc_prompt_cmd
fi
# deps
# fzf https://github.com/junegunn/fzf/releases/download/0.33.0/fzf-0.33.0-linux_amd64.tar.gz
# curl "https://proxy.ohyee.cc/raw.githubusercontent.com/junegunn/fzf/master/bin/fzf-tmux" > ~/env/bin/fzf-tmux
# curl "https://proxy.ohyee.cc/raw.githubusercontent.com/junegunn/fzf/master/shell/key-bindings.bash" > ~/env/fzf-key-bindings.bash
[[ -r "${HOME}/env/fzf-key-bindings.bash" ]] && source ${HOME}/env/fzf-key-bindings.bash
[[ -r "${HOME}/env/fzf/shell/fzf-key-bindings.bash" ]] && source ${HOME}/env/fzf/shell/fzf-key-bindings.bash
if [[ ! "$PATH" == */Users/ohyee/.fzf/bin* ]]; then PATH="${PATH:+${PATH}:}/Users/ohyee/.fzf/bin"; fi
which fzf 1>/dev/null 2>&1
if [[ -z "$?" ]]; then if [[ "$0" == *bash ]]; then eval "$(fzf --bash)"; else if [[ "$0" == *zsh ]]; then eval "$(fzf --zsh)"; fi; fi; fi
# bat https://github.com/sharkdp/bat/releases#:~:text=bat%2Dv0.22.0%2Dx86_64%2Dunknown%2Dlinux%2Dmusl.tar.gz
# https://github.com/rupa/z
[[ -r "/usr/share/z/z.sh" ]] && source /usr/share/z/z.sh
# bash-completion
[[ -r "/usr/share/bash-completion/bash_completion" ]] && source /usr/share/bash-completion/bash_completion
function update_bashrc() { ## 更新 .bashrc
curl -o ${HOME}/.bashrc \
-k \
"http://proxy.ohyee.cc/gist.githubusercontent.com/OhYee/87228bbce831b4b7027e3d6407e7b2f8/raw/.bashrc"
source ~/.bashrc
}
function init_bash() { ## 初始化环境
mkdir -p ~/env
mkdir -p ~/env/bin
cd ~/env
# fzf
FZF_PKG="http://proxy.ohyee.cc/github.com/junegunn/fzf/releases/download/0.33.0/fzf-0.33.0-linux_amd64.tar.gz"
wget $FZF_PKG &&
tar -xzvf $(basename $FZF_PKG) &&
mv fzf ~/env/bin/fzf &&
rm -f $(basename $FZF_PKG)
curl "http://proxy.ohyee.cc/raw.githubusercontent.com/junegunn/fzf/master/bin/fzf-tmux" >~/env/bin/fzf-tmux
curl "http://proxy.ohyee.cc/raw.githubusercontent.com/junegunn/fzf/master/shell/key-bindings.bash" >~/env/fzf-key-bindings.bash
# bat
BAT_PKG="http://proxy.ohyee.cc/github.com/sharkdp/bat/releases/download/v0.22.1/bat-v0.22.1-x86_64-unknown-linux-musl.tar.gz"
wget $BAT_PKG &&
tar -xzvf $(basename $BAT_PKG) &&
mv $(basename ${BAT_PKG} | sed "s/\.tar\.gz$//i")/bat ~/env/bin/bat &&
rm -rf $(basename ${BAT_PKG} | sed "s/\.tar\.gz$//i") $(basename $BAT_PKG)
# tmux
curl -o ~/env/bin/tmux \
http://proxy.ohyee.cc/gist.github.com/OhYee/8bfe27492f9467abf23b304df3caad27/raw/9b55565a9a496155988884b6ed63e2a9fced9e25/tmux &&
chmod a+x ~/env/bin/tmux
source ~/.bashrc
}
# history
export HISTSIZE=100000
export HISTFILESIZE=100000
export HISTTIMEFORMAT='%F %T '
export HISTCONTROL=ignoreboth
# UID and GID
[[ -z $UID ]] && export UID=$(id -u)
[[ -z $GID ]] && export GID=$(id -g)
export VSCODE_UID=$(id -u)
export VSCODE_GID=$(id -g)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/usr/lib:$HOME/usr/lib64
# develop env
export GOPATH=$HOME/go
# Chromeium headless broswer
export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
export CHROME_PATH=/$HOME/chrome
export PUPPETEER_EXECUTABLE_PATH=$CHROME_PATH
export PATH=$PATH:$CHROME_PATH
CAT_OR_BAT=$(
which bat >/dev/null 2>&1
if [[ "$?" = "1" ]]; then echo "less -RF"; else echo "bat --paging=always"; fi
)
FZF_OR_FZF_TMUX=$(
which fzf-tmux >/dev/null 2>&1
if [[ "$?" = "1" ]]; then echo "fzf"; else echo "fzf-tmux"; fi
)
export FZF_DEFAULT_OPTS="--bind 'ctrl-p:toggle-preview' \
--bind 'shift-up:preview-up' \
--bind 'shift-down:preview-down' \
--preview-window=wrap"
# alias
alias ls='ls --color=auto'
alias ll="ls -l"
alias pc="proxychains4"
alias sb="source ~/.bashrc"
alias h=history
alias hh="history | grep"
alias mcnpm="npm --registry=http://registry.npm.taobao.org"
alias manpm="npm --registry=http://registry.npm.alibaba-inc.com"
alias rmi="rm -I"
alias f="${FZF_OR_FZF_TMUX} --height 50% --preview '${CAT_OR_BAT} --style=numbers --color=always {}'"
alias tmux_logs="tmux capture-pane -pS -"
# alias tmux_ssh='eval $(tmux showenv -s SSH_AUTH_SOCK)'
alias chperm="sudo chown -R $USER . && sudo chgrp -R $(id -g -n) ."
alias gwip="git commit -am 'WIP'"
alias gwip2="git commit -am 'WIP' --no-edit --amend"
alias glog="git log --all --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%H%C(reset) %C(bold yellow)%d%C(reset) %C(white) %an%C(reset) %C(dim white)%s%C(reset) %C(bold green)(%ai)%C(reset)'"
alias neovide='open -a "Neovide"'
function cd() {
if [ "$#" != 0 ]; then
builtin cd "$@"
return
fi
while true; do
local DIRS=$(ls -a -p | grep '/$' | sed 's;/$;;')
local DIR="$(printf '%s\n' "${DIRS[@]}" |
fzf --height 50% \
--reverse \
--bind "ctrl-p:toggle-preview" \
--preview '
__cd_nxt="$(echo {})";
__cd_path="$(echo $(pwd)/${__cd_nxt} | sed "s;//;/;")";
echo $__cd_path;
echo;
ls -p --color=always "${__cd_path}";
')"
[ ${#DIR} == 0 ] && return 0
echo "cd $(realpath $DIR)"
builtin cd "$DIR" &>/dev/null
done
}
function npmr() { ## npm run 自动选择
[ ! -e "package.json" ] && return
local CMD=$(cat package.json | jq -r '.scripts | keys[] ' | sort | ${FZF_OR_FZF_TMUX} --height 50%)
echo "npm run $CMD"
npm run $CMD
}
function gpush() { ## 快速 push
Branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
if [[ $? -ne 0 ]]; then
echo "not a git repository"
return
fi
git push origin ${Branch}:${Branch} $@
}
function gsave() { ## 快速 commit 备份
if [[ -n "$WF" ]]; then
if [[ "$WF" != "$(pwd)" ]]; then
echo "pwd is directory: $(pwd)"
echo "not in workspace: $WF"
return
fi
fi
Branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
if [[ $? -ne 0 ]]; then
echo "not a git repository"
return
fi
Now=$(date +%Y%m%d%H%M%S)
NewBranch="ohyee-backup-$Now"
git checkout -b $NewBranch && git add . && git commit -c $Branch
git status
echo "use $(gpush) to push"
}
function gb() { ## 分支切换
_PREVIEW="git log \
--abbrev-commit \
--decorate \
--color \
-50 \
--format=format:'%C(bold blue)%h%C(reset) %C(white) %an%C(reset) %C(dim white)%s%C(reset) %C(bold green)(%ai)%C(reset)'"
BRANCHS=$(
git --no-pager \
branch \
--all \
--format="%(if)%(HEAD)%(then)%(else)%(if:equals=HEAD)%(refname:strip=3)%(then)%(else)%1B[0;34;1mbranch%09%1B[m%(refname:short)%(end)%(end)" |
sed '/^$/d'
) || return
TAGS=$(git --no-pager tag | awk '{print "\x1b[35;1mtag\x1b[m\t" $1}') || return
TARGET=$( (
echo "$BRANCHS"
echo "$TAGS"
) |
${FZF_OR_FZF_TMUX} \
--height 50% \
--no-hscroll \
--no-multi \
--ansi \
--bind ctrl-p:toggle-preview \
--preview="$_PREVIEW '{2}'") || return
git checkout $(awk '{print $2}' <<<"$TARGET")
}
function gdiff() {
git diff --name-only $@ |
fzf --no-multi \
--ansi \
--preview "git diff $@ --color=always -- {-1}" \
--header="[$@] enter show file, alt+f show diff" \
--bind "alt-f:execute: sh -c 'echo $@ {-1} && git show $@ -- {-1} | ${CAT_OR_BAT} -ldiff'" \
--bind "enter:execute: ${CAT_OR_BAT} {-1}" \
--bind "ctrl-p:toggle-preview"
}
function gshow() {
_GIT_LOG="git log --color --abbrev-commit --decorate $@ --format='format:%C(bold blue)%h%C(reset) %C(white) %an%C(reset) %s'"
_GIT_LOG2="git log %# -n 1 --abbrev-commit --decorate --color --stat --format=format:'%C(bold yellow)%d%C(reset) %n%C(bold blue)%H%C(reset) %n%C(bold green)%ai%C(reset) %n%C(white)%n%an%C(reset) %n%C(dim white)%s%C(reset) %n%n'"
_GIT_HASH="grep -o '[a-f0-9]\{7\}' | head -1"
bash -c "$_GIT_LOG" |
fzf --no-sort --reverse --tiebreak=index --no-multi \
--ansi \
--header "enter to view commit diff" \
--preview-window=wrap \
--preview "echo {} | $_GIT_HASH | xargs -I %# ${_GIT_LOG2}" \
--bind "enter:execute: echo {} | ${_GIT_HASH} | xargs -I %# bash -i -c 'echo %# && gdiff %#^!'" \
--bind "ctrl-p:toggle-preview"
}
function grb() { ## rebase origin
BRANCH="master"
[[ -n $1 ]] && BRANCH=$1
git fetch --all && git rebase "origin/${BRANCH}"
}
function drm() {
local CID
CID=$(docker ps -a |
sed 1d |
fzf -m \
--ansi \
--preview "docker inspect {1} --format='\
Name: {{.Name}}{{println}}\
Image: {{.Config.Image}}{{println}}\
Created: {{.Created}}{{println}}\
PATH: {{.Path}}{{println}}\
Entrypoint: {{.Config.Entrypoint}}{{println}}\
Mount: {{println}}\
{{range .HostConfig.Binds}}{{println \" \" .}}{{end}}\
Host: {{.Config.Hostname}}{{println}}\
Env:{{println}}{{range .Config.Env}}{{println \" \" .}}{{end}}\
IP: {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}{{println}}\
Port:{{println}}{{ range \$key, \$value := .Config.ExposedPorts}}{{println \" \" \$key}}{{end}}\
' && echo "----------" && docker logs --tail 20 {1}" \
--preview-window=wrap \
--bind "ctrl-p:toggle-preview" |
awk '{print $1}')
[ -n "$CID" ] && echo "$CID" | xargs docker rm $@
}
function dexec() {
local CID
CID=$(docker ps -a |
sed 1d |
fzf --ansi \
--preview "docker inspect {1} --format='\
Name: {{.Name}}{{println}}\
Image: {{.Config.Image}}{{println}}\
Created: {{.Created}}{{println}}\
PATH: {{.Path}}{{println}}\
Entrypoint: {{.Config.Entrypoint}}{{println}}\
Mount: {{println}}\
{{range .HostConfig.Binds}}{{println \" \" .}}{{end}}\
Host: {{.Config.Hostname}}{{println}}\
Env:{{println}}{{range .Config.Env}}{{println \" \" .}}{{end}}\
IP: {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}{{println}}\
Port:{{println}}{{ range \$key, \$value := .Config.ExposedPorts}}{{println \" \" \$key}}{{end}}\
' && echo "----------" && docker logs --tail 20 {1}" \
--preview-window=wrap \
--bind "ctrl-p:toggle-preview" |
awk '{print $1}')
[ -n "$CID" ] && docker exec -it $@ $CID /bin/bash
}
function drmi() {
local CID
CID=$(docker images | sed 1d | fzf -m | awk '{print $3}')
echo $CID
[ -n "$CID" ] && echo "$CID" | xargs docker rmi $@
}
function clear_vscode_socks() {
arr=()
arr+=$(ls -t1 /run/user/$(id -u)/vscode-ipc-* 2>>/dev/null)
arr+=$(ls -t1 /tmp/vscode-ipc-* 2>>/dev/null)
for item in $arr; do
if [ "$(_check_unix_sock $item)" == "1" ] || [ "$1" == "-f" ]; then
echo "delete $item"
rm -f $item
else
echo "keep $item"
fi
done
}
function _check_unix_sock() {
nc -U -z $1 2>&1 >/dev/null
echo $?
}
function rcode() { ## SSH VSCode 唤起
# https://stackoverflow.com/questions/66581313/open-files-from-remote-ssh-host-in-vscode
# https://github.com/microsoft/vscode-remote-release/issues/3324
# https://github.com/microsoft/vscode-remote-release/issues/3738
[ -z "$TMUX" ] && eval $(tmux showenv -s SSH_CONNECTION)
SSH_CLIENT=$(cut -d ' ' -f1 <<<"$SSH_CONNECTION")
SSH_SERVER=$(cut -d ' ' -f3 <<<"$SSH_CONNECTION")
VSCODE_BIN=$(ls -t1 ${HOME}/.vscode-server/bin/*/bin/code | tail -n 1)
# 获取 VSCODE 通信 sock
if [ -n $VSCODE_IPC_HOOK_CLI ]; then
if [ ! -f $VSCODE_IPC_HOOK_CLI ] || [ "$(_check_unix_sock $VSCODE_IPC_HOOK_CLI)" == "1" ]; then
unset VSCODE_IPC_HOOK_CLI
fi
fi
if [ -z "$VSCODE_IPC_HOOK_CLI" ]; then
arr=()
arr+=$(ls -t1 /run/user/$(id -u)/vscode-ipc-* 2>>/dev/null)
arr+=$(ls -t1 /tmp/vscode-ipc-* 2>>/dev/null)
for item in $arr; do
if [[ $(_check_unix_sock $item) == "0" ]]; then
VSCODE_IPC_HOOK_CLI=$item
break
else
echo "rm $item"
rm -f $item
fi
done
fi
export VSCODE_IPC_HOOK_CLI
for ARG in "$@"; do
ABS_PATH=$(realpath $ARG)
CODE_ARGS=""
if [[ -f $ABS_PATH ]]; then
# open file
CODE_ARGS="--file-uri 'vscode-remote://ssh-remote+${SSH_SERVER}${ABS_PATH}'"
fi
if [[ -d $ABS_PATH ]]; then
if [ -e $ABS_PATH/.devcontainer ]; then
# open container, disabled
RAW="{\"hostPath\":\"${ABS_PATH}\",\"localDocker\":false,\"settings\":{\"host\":\"ssh://${SSH_SERVER}\"}}"
CODE_ARGS="--folder-uri 'vscode-remote://dev-container+$(printf $RAW | od -A n -t x1 | tr -d '[\n\r ]')/workspaces/$(basename $ABS_PATH)'"
else
# open folder
CODE_ARGS="--folder-uri 'vscode-remote://ssh-remote+${SSH_SERVER}${ABS_PATH}'"
fi
fi
if [[ -z $VSCODE_IPC_HOOK_CLI ]]; then
# no connected socks, using ssh
echo "Using reverse ssh, input client ssh password"
if [ -z $LOCAL_USER ]; then
LOCAL_USER=$(whoami)
echo "ssh client username(LOCAL_USER) not set, using $LOCAL_USER"
fi
CMD="ssh ${LOCAL_USER}@${SSH_CLIENT} bash -c \"code ${CODE_ARGS}\""
else
echo "Using sock $VSCODE_IPC_HOOK_CLI"
CMD="${VSCODE_BIN} ${CODE_ARGS}"
fi
echo "code ${CODE_ARGS}"
sh -c "$CMD"
echo $CMD
done
}
function pkg() { ## 快速配置开发环境
_COMMAND="$1"
_PKG="$2"
_VERSION="$3"
_SYSTEM=""
_ARCH=""
_VERSION_NO_PREFIX_V="$_VERSION"
function _help() {
echo "开发环境配置工具"
echo -e " \033[1;36m安装环境\033[0m \033[2mpkg install <language> [<version>]\033[0m"
echo -e " \033[1;36m列举环境\033[0m \033[2mpkg list <language>\033[0m"
echo -e " \033[1;36m删除环境\033[0m \033[2mpkg remove <language>\033[0m"
echo -e " \033[1;36m配置环境\033[0m \033[2mpkg config <language>\033[0m"
echo ""
echo "支持的包: golang, nodejs, python, neovim, lazygit, ripgrep, fzf, tmux, proxychains"
}
_TARGET=$ENV_FOLDER
if [[ -n "$PKG_TARGET" ]]; then
_TARGET=$PKG_TARGET
fi
case "$(uname)" in
"Linux") _SYSTEM="linux";;
"Darwin") _SYSTEM="darwin";;
"CYGWIN"* | "MINGW"* | "MSYS") _SYSTEM="windows";;
*) echo "Unknown System $(uname)"; _help; return ;;
esac
case "$(uname -m)" in
"x86_64") _ARCH="x64" ;;
"armv7l") _ARCH="armv7l" ;;
"arm" | "arm64" | "aarch64") _ARCH="arm64" ;;
*) echo "Unknown CPU Architecture $(uname -m)"; _help; return ;;
esac
case "$_PKG" in
"node" | "nodejs" | "js" ) _PKG="nodejs";;
"go" | "golang" ) _PKG="golang";;
"py" | "python" | "python3" | "py2" | "py3" ) _PKG="python";;
"nvim" | "neovim") _PKG="neovim";;
"lazygit") _PKG="lazygit";;
"ripgrep" | "rg") _PKG="ripgrep";;
"fzf") _PKG="fzf";;
"tmux") _PKG="tmux";;
"proxychains" | "pc" | "proxychain" | "proxychains-ng") _PKG="proxychains";;
*) echo "Unknown Language ${_PKG}"; _help; return;;
esac
_REMOTE_VERSION_LIST=""
_LOCAL_VERSION_LIST=""
_VERSION_NAME="${_PKG}-${_VERSION}"
_PKG_TAR="/tmp/${_VERSION_NAME}.tar.gz"
_PKG_DIR="${_TARGET}/${_VERSION_NAME}"
_PKG_FILE="${_TARGET}/${_PKG}"
_URL=""
function _declare_name() {
_VERSION_NAME="${_PKG}-${_VERSION}"
_PKG_TAR="/tmp/${_VERSION_NAME}.tar.gz"
_PKG_DIR="${_TARGET}/${_VERSION_NAME}"
_PKG_FILE="${_TARGET}/${_PKG}"
if [[ "$(echo "${_VERSION}" | awk '/^[0-9].*/' | wc -l)" -ne "0" ]]; then
_VERSION="v${_VERSION}"
fi
_VERSION_NO_PREFIX_V=$(echo "${_VERSION}" | sed 's/^v//g' )
}
function _list() {
cat /dev/null
}
function _url() {
cat /dev/null
}
function _download() {
curl -L "$_URL" -o "${_PKG_TAR}"
}
function _extract() {
rm -rf /tmp/${_VERSION_NAME}
mkdir -p /tmp/${_VERSION_NAME}
tar -xzvf ${_PKG_TAR} --strip-components 1 -C /tmp/${_VERSION_NAME}
}
function _move() {
if [[ ! -d "/tmp/${_VERSION_NAME}/bin" ]]; then
echo "Folder /tmp/${_VERSION_NAME}/bin is not exists"
return
fi
mv /tmp/${_VERSION_NAME} "${_PKG_DIR}"
}
function _use() {
if [[ ! -d "${_PKG_DIR}/bin" ]]; then
echo "Folder ${_PKG_DIR}/bin is not exists"
return
fi
rm -f "${_PKG_FILE}"
ln -s "${_PKG_DIR}" "${_PKG_FILE}"
}
function _config() {
cat /dev/null
}
function _clear() {
rm -rf ${_PKG_TAR}
rm -rf /tmp/${_VERSION_NAME}
}
function _nodejs_list() {
_REMOTE_VERSION_LIST=$(curl -s https://mirrors.aliyun.com/nodejs-release/index.json | awk -F'"' '/version/ {print $4}')
_LOCAL_VERSION_LIST=$(ls $_TARGET | awk -F - '/nodejs/ {print $2}')
}
function _nodejs_url() {
_URL="https://mirrors.aliyun.com/nodejs-release/${_VERSION}/node-${_VERSION}-${_SYSTEM}-${_ARCH}.tar.gz"
}
function _nodejs_config() {
npm config set registry https://registry.npmmirror.com
}
function _golang_list() {
_REMOTE_VERSION_LIST=$(curl -s "https://mirrors.aliyun.com/golang/" | awk -F'[<>]' '/<td class="link"><a href=.*linux-amd64.tar.gz</ {print $5}' | sed 's/.linux-amd64.tar.gz//g' | sed 's/^go//g' | sort --version-sort -r)
_LOCAL_VERSION_LIST=$(ls $_TARGET | awk -F - '/golang/ {print $2}')
}
function _golang_url() {
if [[ "$_ARCH" == "armv7l" ]]; then _ARCH="arm"; fi
if [[ "$_ARCH" == "x64" ]]; then _ARCH="amd64"; fi
_URL="https://mirrors.aliyun.com/golang/go${_VERSION_NO_PREFIX_V}.${_SYSTEM}-${_ARCH}.tar.gz"
}
function _golang_config() {
go env -w "GOPRIVATE=*.alibaba-inc.com"
go env -w "GOPROXY=https://mirrors.aliyun.com/goproxy/,direct"
}
function _python_list() {
_REMOTE_VERSION_LIST=$(curl -s https://mirrors.aliyun.com/python-release/source/ | awk -F'[<>]' '/<td class="link"><a href=/ {print $5}' | awk -F '[.-]' '/.tar.xz$/ {printf "%s.%s.%s\n", $2,$3,$4}' | sort --version-sort -r)
_LOCAL_VERSION_LIST=$(ls $_TARGET | awk -F - '/python/ {print $2}')
}
function _python_url() {
_URL="https://mirrors.aliyun.com/python-release/source/Python-${_VERSION_NO_PREFIX_V}.tgz"
}
function _python_extract() {
rm -rf /tmp/${_VERSION_NAME}_src
mkdir -p /tmp/${_VERSION_NAME}_src
tar xzvf ${_PKG_TAR} --strip-components 1 -C /tmp/${_VERSION_NAME}_src
cd /tmp/${_VERSION_NAME}_src && ./configure --prefix=${_PKG_DIR} --enable-optimizations && make -j8 && make install -j8 && cd -
}
function _python_move() {
cat /dev/null
}
function _python_config() {
pip3 config set global.index-url mirrors.aliyun.com/pypi/simple/
}
function _python_clear() {
_clear
rm -rf /tmp/${_PKG_TAR}_src
}
function _neovim_list() {
_REMOTE_VERSION_LIST=$(curl -s "https://proxy.ohyee.cc/api.github.com/repos/neovim/neovim/releases?per_page=100&page=1" | awk -F'"' '/tag_name.*v.*/ {print $4}')
_LOCAL_VERSION_LIST=$(ls $_TARGET | awk -F - '/neovim/ {print $2}')
}
function _neovim_url() {
if [[ "${_SYSTEM}" == "darwin" ]]; then _SYSTEM="macos"; fi
if [[ "${_ARCH}" == "x64" ]]; then _ARCH="x64_64"; fi
_URL="https://proxy.ohyee.cc/github.com/neovim/neovim/releases/download/${_VERSION}/nvim-${_SYSTEM}-x86_64.tar.gz"
}
function _lazygit_list() {
_REMOTE_VERSION_LIST=$(curl -s "https://proxy.ohyee.cc/api.github.com/repos/jesseduffield/lazygit/releases?per_page=100&page=1" | awk -F'"' '/tag_name/ {print $4}')
_LOCAL_VERSION_LIST=$(ls $_TARGET | awk -F - '/lazygit/ {print $2}')
}
function _lazygit_url() {
if [[ "${_SYSTEM}" == "darwin" ]]; then _SYSTEM="Darwin"; fi
if [[ "${_SYSTEM}" == "linux" ]]; then _SYSTEM="Linux"; fi
if [[ "${_ARCH}" == "x64" ]]; then _ARCH="x64_64"; fi
_URL="https://proxy.ohyee.cc/github.com/jesseduffield/lazygit/releases/download/${_VERSION}/lazygit_${_VERSION_NO_PREFIX_V}_${_SYSTEM}_${_ARCH}.tar.gz"
}
function _lazygit_extract() {
rm -rf /tmp/${_VERSION_NAME}
mkdir -p /tmp/${_VERSION_NAME}
tar -xzvf ${_PKG_TAR} -C /tmp/${_VERSION_NAME}
mkdir -p /tmp/${_VERSION_NAME}/bin
mv /tmp/${_VERSION_NAME}/lazygit /tmp/${_VERSION_NAME}/bin/lazygit
}
function _ripgrep_list() {
_REMOTE_VERSION_LIST=$(curl -s "https://proxy.ohyee.cc/api.github.com/repos/BurntSushi/ripgrep/releases?per_page=100&page=1" | awk -F'"' '/tag_name/ {print $4}')
_LOCAL_VERSION_LIST=$(ls $_TARGET | awk -F - '/ripgrep/ {print $2}')
}
function _ripgrep_url() {
if [[ "${_SYSTEM}" == "darwin" ]]; then _SYSTEM="apple-darwin"; fi
if [[ "${_SYSTEM}" == "linux" ]]; then _SYSTEM="unknown-linux-gnu"; fi
if [[ "${_ARCH}" == "x64" ]]; then _ARCH="x64_64"; fi
if [[ "${_ARCH}" == "arm64" ]]; then _ARCH="aarch64"; fi
_URL="https://proxy.ohyee.cc/github.com/BurntSushi/ripgrep/releases/download/${_VERSION}/ripgrep-${_VERSION_NO_PREFIX_V}-${_ARCH}-${_SYSTEM}.tar.gz"
}
function _ripgrep_extract() {
rm -rf /tmp/${_VERSION_NAME}
mkdir -p /tmp/${_VERSION_NAME}
tar -xzvf ${_PKG_TAR} --strip-components 1 -C /tmp/${_VERSION_NAME}
mkdir -p /tmp/${_VERSION_NAME}/bin
mv /tmp/${_VERSION_NAME}/rg /tmp/${_VERSION_NAME}/bin/rg
}
function _fzf_list() {
_REMOTE_VERSION_LIST=$(curl -s "https://proxy.ohyee.cc/api.github.com/repos/junegunn/fzf/releases?per_page=100&page=1" | awk -F'"' '/tag_name/ {print $4}')
_LOCAL_VERSION_LIST=$(ls $_TARGET | awk -F - '/fzf/ {print $2}')
}
function _fzf_url() {
if [[ "${_ARCH}" == "x64" ]]; then _ARCH="amd64"; fi
_URL="https://proxy.ohyee.cc/github.com/junegunn/fzf/releases/download/${_VERSION}/fzf-${_VERSION_NO_PREFIX_V}-${_SYSTEM}_${_ARCH}.tar.gz"
}
function _fzf_extract() {
rm -rf /tmp/${_VERSION_NAME}
mkdir -p /tmp/${_VERSION_NAME}/bin
tar -xzvf ${_PKG_TAR} -C /tmp/${_VERSION_NAME}/bin
if [[ ! -e "/tmp/${_VERSION_NAME}/shell/key-bindings.bash" ]]; then
mkdir -p /tmp/${_VERSION_NAME}/shell
curl https://proxy.ohyee.cc/raw.githubusercontent.com/junegunn/fzf/refs/tags/${_VERSION}/shell/key-bindings.bash -s -L -o /tmp/${_VERSION_NAME}/shell/key-bindings.bash
fi
}
function _tmux_list() {
_REMOTE_VERSION_LIST=$(curl -s "https://proxy.ohyee.cc/api.github.com/repos/tmux/tmux/releases?per_page=100&page=1" | awk -F'"' '/tag_name/ {print $4}')
_LOCAL_VERSION_LIST=$(ls $_TARGET | awk -F - '/tmux/ {print $2}')
}
function _tmux_url() {
if [[ "${_ARCH}" == "x64" ]]; then _ARCH="amd64"; fi
_URL="https://proxy.ohyee.cc/github.com/tmux/tmux/releases/download/${_VERSION_NO_PREFIX_V}/tmux-${_VERSION_NO_PREFIX_V}.tar.gz"
}
function _tmux_extract() {
rm -rf /tmp/${_VERSION_NAME} /tmp/${_VERSION_NAME}_src
mkdir -p /tmp/${_VERSION_NAME}_src
tar xzvf ${_PKG_TAR} --strip-components 1 -C /tmp/${_VERSION_NAME}_src
cd /tmp/${_VERSION_NAME}_src && ./configure --prefix=${_PKG_DIR} && make -j8 && make install -j8 && cd -
}
function _tmux_move() {
cat /dev/null
}
function _tmux_clear() {
_clear
rm -rf /tmp/${_PKG_TAR}_src
}
function _proxychains_list() {
_REMOTE_VERSION_LIST=$(curl -s "https://proxy.ohyee.cc/api.github.com/repos/rofl0r/proxychains-ng/releases?per_page=100&page=1" | awk -F'"' '/tag_name/ {print $4}')
_LOCAL_VERSION_LIST=$(ls $_TARGET | awk -F - '/proxychains/ {print $2}')
}
function _proxychains_url() {
if [[ "${_ARCH}" == "x64" ]]; then _ARCH="amd64"; fi
_URL="https://proxy.ohyee.cc/github.com/rofl0r/proxychains-ng/releases/download/${_VERSION}/proxychains-ng-${_VERSION_NO_PREFIX_V}.tar.xz"
}
function _proxychains_extract() {
rm -rf /tmp/${_VERSION_NAME} /tmp/${_VERSION_NAME}_src
mkdir -p /tmp/${_VERSION_NAME}_src
tar xvf ${_PKG_TAR} --strip-components 1 -C /tmp/${_VERSION_NAME}_src
cd /tmp/${_VERSION_NAME}_src && ./configure --prefix=${_PKG_DIR} && make -j8 && make install -j8 && cd -
}
function _proxychains_move() {
cat /dev/null
}
function _proxychains_clear() {
_clear
rm -rf /tmp/${_PKG_TAR}_src
}
function _proxychains_config() {
target="$HOME/.proxychains/proxychains.conf"
mkdir -p $(dirname $target)
echo "strict_chain
proxy_dns
tcp_read_time_out 15000
tcp_connect_time_out 8000
localnet 127.0.0.0/255.0.0.0
[ProxyList]
socks5 127.0.0.1 10808" > $target
echo "Write config to $target"
}
function _run_class() {
cmd1="_${_PKG}_$1"
cmd2="_$1"
if declare -f $cmd1 > /dev/null; then
$cmd1
else
$cmd2
fi
}
function _install() {
if [ ! -d "${_PKG_DIR}" ]; then
if [ ! -e "${_PKG_TAR}" ]; then
_run_class url
echo "Download $_URL to $_PKG_TAR"
if [ -z "$_URL" ]; then return; fi
_run_class download
fi
echo "Extract ${_VERSION_NAME} from ${_PKG_TAR}"
_run_class extract
_run_class move
fi
echo "Redirect ${_PKG_FILE} => ${_PKG_DIR}"
_run_class use
# _run_class clear
}
case "$_COMMAND" in
"install")
if [ -z "$_VERSION" ]; then
_run_class list
_VERSION=$(echo "$_REMOTE_VERSION_LIST" | head -n1)
fi
_declare_name
echo "install $_PKG $_VERSION"
_install
;;
"remove")
_declare_name
if [ -z "${_VERSION}" ]; then
echo "remove $_PKG"
rm -rf "${_PKG_FILE}"
bash -c "rm -rf /tmp/${_PKG}*"
bash -c "rm -rf ${_TARGET}/${_PKG}*"
else
echo "remove ${_PKG_DIR} ${_VERSION}"
rm -rf "${_PKG_DIR}"
_run_class clear
fi
;;
"list")
echo "list $_PKG"
_run_class list
echo -e "Remote Versions:\n$(echo $_REMOTE_VERSION_LIST | xargs)\n"
echo -e "Local Versions:\n$(echo $_LOCAL_VERSION_LIST | xargs)\n"
;;
"config")
echo "config $PKG"
PATH="${_PKG_FILE}/bin:$PATH"
_run_class config
;;
*)
_help
return
esac
}
function retry() {
local attempt=0
local command="$*"
while true; do
echo -e "\nRun command \033[2m$command\033[0m, attempt: \033[2;3m$attempt\033[0m"
$command
status=$?
if [ $status -eq 0 ]; then
break
else
attempt=$((attempt + 1))
sleep 1
fi
done
}
function use() { ## 从 env 加载环境变量
for env in $@; do
if [[ -e "$env" ]]; then
echo -e " => use \033[2;3m$env\033[0m"
set -a
eval $(cat $env | grep -v "#")
set +a
fi
done
}
function q() {
local _CMDS=$(echo -e "${_QUICK_COMMAND}" | grep -v "^$" | sort | uniq)
local _RESULT=$(
echo "${_CMDS}" | fzf \
--preview 'echo {} | awk -F " ## " "{printf \"%s\n \033[2m%s\033[0m\", \$1, \$2}"'
)
if [ -z "$_RESULT" ]; then return; fi
local _CMD=$(echo "${_RESULT}" | awk -F ' ## ' '{printf $1}')
echo -e "Run \033[2m${_CMD}\033[0m"
bash -i -c "${_CMD}"
}
_QUICK_COMMAND='
echo $PATH | tr -s ":" "\\n" ## show path
glog ## show git log graph
gshow ## show git log
'
export _QUICK_COMMAND
# local bashrc
if [[ -e "$HOME/.local.bashrc" ]]; then
source "$HOME/.local.bashrc"
fi
# _BASHRCS=$(ls -a ~ | grep "^\..*\.bashrc$") if [[ -e "$HOME/.local.bashrc" ]]; then
# for f in $_BASHRCS; do source "$HOME/.local.bashrc"
# if [[ -e "$HOME/$f" ]]; then fi
# source "$HOME/$f"
# fi
# done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment