Last active
March 23, 2025 12:34
-
-
Save OhYee/87228bbce831b4b7027e3d6407e7b2f8 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
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