Skip to content

Instantly share code, notes, and snippets.

@akalineskou
Last active September 10, 2025 10:00
Show Gist options
  • Select an option

  • Save akalineskou/4a26967a4680eef525eec1e2103323ca to your computer and use it in GitHub Desktop.

Select an option

Save akalineskou/4a26967a4680eef525eec1e2103323ca to your computer and use it in GitHub Desktop.
Useful bash_aliases
# bash_aliases
alias reload_bash_aliases="source ~/.bash_aliases"
alias nano_bash_aliases="nano ~/.bash_aliases"
# general
function check_variable_set() {
if [ -z ${1+x} ]; then echo "Variable not set"; return 1; fi;
if [ -z ${2+x} ]; then echo "Variable name not set"; return 1; fi;
if [ -z "$1" ]; then echo "$2 not set"; return 1; fi;
}
function check_array_not_empty() {
array="$1"
if [ ${#array[@]} -eq 0 ]; then echo "No items found"; return 1; fi;
}
function check_variable_integer() {
return $([[ $1 =~ ^[\-0-9]+$ ]]);
}
function check_variable_integer_positive() {
check_variable_integer "$1" || return 1;
return $([[ $1 -gt 0 ]]);
}
alias file_browser_open="xdg-open ."
function lockscreen_toggle_kde() {
# get autolock value
status=$(grep -e "Autolock=" ~/.config/kscreenlockerrc | cut -c10-)
# toggle status value
if [ "$status" == 'false' ]; then
status=true
statusString="Enabled"
else
status=false
statusString="Disabled"
fi;
# replace in file
sed -ni "/Autolock=.*/!{s/\[Daemon]/[Daemon]\nAutolock=${status}/;p}" ~/.config/kscreenlockerrc
qdbus org.freedesktop.ScreenSaver /ScreenSaver configure
echo "Lock screen: $statusString"
}
alias ip_addr="hostname -I | awk '{print \$1}'"
function fix_line_feed_to_carriage_return() {
check_variable_set "$1" "File(s)" || return 1
sed -i 's/\r//g' "$@"
}
alias please='sudo "$BASH" -c "$(history -p !!)"'
function find_in_folder_by_pattern() {
check_variable_set "$1" "Pattern" || return 1
if [ -z "$2" ]; then DIR=$PWD; else DIR="$2"; fi;
grep --exclude-dir={.idea,.git,.vh_composer_cache} -e "$1" -rnw $DIR
}
function confirm() {
if [[ $SHELL =~ zsh ]]; then
read "response?Are you sure? [Y/n] "
else
read -r -p "Are you sure? [Y/n] " response
fi
case "$response" in
Y)
true
;;
*)
echo "Ignoring command..."
false
;;
esac
}
# set BREAK_ON_ERROR if it needs to close on an error exit code
function run_command_times_and_print_result() {
check_variable_set "$1" "Times" || return 1
check_variable_set "$2" "Command" || return 1
declare -A exits
start_time=$(date)
i=0
for run in $(seq 1 $1); do
echo "Run: $run/$1"
${@:2}
exit_code=$?
(( i++ ))
(( exits[$exit_code]++ ))
if [[ ! -z ${BREAK_ON_ERROR+x} ]] && [[ $exit_code -ne 0 ]]; then break; fi
done
end_time=$(date)
echo
echo "Ran command '${@:2}' $i times"
echo
for code in "${!exits[@]}" ; do
echo "Code: $code has exited ${exits[$code]} times"
done
echo
echo "Start time $start_time"
echo "End time $end_time"
}
alias date_format_simple="date '+%Y%m%d%H%M%S'"
alias view_listening_ports="lsof -i -P -n | grep LISTEN"
function toggle_xdebug() {
check_variable_set "$1" "Service" || return 1
if dce_command $1 "[[ -f /usr/local/etc/php/conf.d/zz_xdebug.ini ]]"
then
dce_command $1 "mv /usr/local/etc/php/conf.d/zz_xdebug.ini /usr/local/etc/php/conf.d/zz_xdebug.ini.disabled"
echo -e "Xdebug is now ${RED}disabled${NC}"
dc_restart $1
else
dce_command $1 "mv /usr/local/etc/php/conf.d/zz_xdebug.ini.disabled /usr/local/etc/php/conf.d/zz_xdebug.ini"
echo -e "Xdebug is now ${GREEN}enabled${NC}"
dc_restart $1
fi
}
function run_forever() {
check_variable_set "$1" "Command" || return 1
while :; do eval "$1"; sleep 0.5; done
}
# cd
alias cd_dev="cd ~/dev"
# git
is_folder_git() { [ -d .git ] || git rev-parse --git-dir 2> /dev/null; }
alias gs="git status"
alias gc="git clone"
function gc_branch() {
check_variable_set "$1" "Repository" || return 1
check_variable_set "$2" "Branch" || return 1
git clone -b $1 $2
}
alias gsi="git submodule init"
alias gsu="git submodule update --init --recursive"
alias gss="git submodule status"
function gsa() {
check_variable_set "$1" "Repository" || return 1
check_variable_set "$2" "Directory" || return 1
git submodule add $1 $2
}
alias gca="git commit --amend"
alias gcaa="git add -A && gca"
function gcm() {
git commit -m "$*"
}
function gcam() {
check_variable_set "$1" "Message" || return 1
git add -A && git commit -m "$*"
}
alias gbs="git branch"
alias gb="gbs | grep \* | cut -d ' ' -f2"
alias gb_recent="gbs --sort=-committerdate"
alias gcb="git checkout"
alias gcb_remote="gcb --track"
alias gc-="gcb -"
alias gcdpl="gcb dev && gpl"
alias gcmpl="gcb main && gpl"
alias gcn="gcb -b"
alias gp="git push"
alias gp_skip_ci="gp -o ci.skip"
function gpu() {
gp -u origin $(gb)
}
function gpu_skip_ci() {
gp -u origin $(gb) -o ci.skip
}
alias gpu_skip_ci="gpu -o ci.skip"
alias gpf="git push --force-with-lease"
alias gpf_skip_ci="gp --force-with-lease -o ci.skip"
alias gpl="git pull"
alias gf="git fetch"
alias gr="git rebase"
alias grd="gcdpl && gc- && gr dev"
alias grm="gcmpl && gc- && gr main"
alias gri="gr -i"
function grih() {
check_variable_set "$1" "Number" || return 1
gri HEAD~"$1"
}
alias grc="gr --continue"
alias gra="gr --abort"
alias gmc="git merge --continue"
alias gma="git merge --abort"
alias gcp="git cherry-pick"
alias gcpc="git cherry-pick --continue"
alias gcpa="git cherry-pick --abort"
alias glg="git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
alias glcm="git log --oneline -n 1 HEAD | head -n 1"
alias git_log_comits_only_reverse="git log --pretty=format:'%h %s' -20 --reverse"
alias grs="git remote -v"
alias gst="git stash --include-untracked"
# alias gstp="git stash pop"
function git_delete_last_commit_keep_changes() {
check_variable_integer_positive "$1" && times=$1 || times=1;
for i in $(seq 1 $times); do
git reset HEAD^
done
git add .
}
function git_delete_commits_keep_changes() {
check_variable_set "$1" "Branch" || return 1
git reset --soft $1
}
alias git_prune_local_branches_preview="git fetch -p && gbs -vv | grep ': gone]' | awk '{print \$1}' | xargs -n1"
alias git_prune_local_branches_do="git_prune_local_branches_preview git branch -d"
alias git_prune_local_branches_do_force="git_prune_local_branches_preview git branch -D"
alias git_tag_with_dates="git tag --sort=-committerdate --format='%(creatordate:local)%09%(refname:strip=2)'"
alias git_rebase_sign_from_hash="git rebase --exec 'git commit --amend --no-edit -n -S' -i"
function git_rename_branch_current() {
check_variable_set "$1" "New branch" || return 1
gbs -m $1
}
function git_rename_branch_oldBranch_newBranch() {
check_variable_set "$1" "Old branch" || return 1
check_variable_set "$2" "New branch" || return 1
gbs -m $1 $2
}
function git_set_author_committer_temporary() {
check_variable_set "$1" "Name" || return 1
check_variable_set "$2" "Email" || return 1
export GIT_COMMITTER_NAME="$1"
export GIT_COMMITTER_EMAIL="$2"
export GIT_AUTHOR_NAME="$1"
export GIT_AUTHOR_EMAIL="$2"
}
function git_ammend_author_commiter() {
check_variable_set "$1" "Name" || return 1
check_variable_set "$2" "Email" || return 1
git -c user.name="$1" -c user.email="$2" commit --amend --reset-author
}
function git_reset_file() {
check_variable_set "$1" "File" || return 1
gcb -- $1;
}
function git_reset_file_to_revision() {
check_variable_set "$1" "File" || return 1
check_variable_set "$2" "Revision" || return 1
gcb $2 -- $1;
}
function git_unstage_file() {
check_variable_set "$1" "File" || return 1
git reset -- $1;
}
alias gcl="git cola"
alias git_diff_dev_stat="git diff dev... --stat"
alias git_diff_main_stat="git diff main... --stat"
# composer
alias ci="composer install"
alias cu="composer update"
alias cr="composer require"
alias crd="composer require --dev"
alias cl="composer lint"
alias ct="composer test"
# mutagen
function msp() {
session=${PWD##*/}
mutagen sync pause $session
echo "Paused $session... To resume: msr"
}
function msr() {
session=${PWD##*/}
mutagen sync resume $session
echo "Resumed $session... To pause: msp"
}
# docker
alias dc="docker compose"
alias dcps="dc ps"
function dcd() {
if [ -f "docker-compose-osx.yml" ]; then
mutagen-compose down
else
dc down
fi
}
function dcu() {
if [ -f "docker-compose-osx.yml" ]; then
mutagen-compose -f docker-compose.yml -f docker-compose-osx.yml up ${@:1}
else
dc up ${@:1}
fi
}
alias dcub="dcu --build"
alias dcud="dcu -d"
alias dcudb="dcud --build"
alias dcexec="dc exec"
alias dcrun="dc run"
function dce() {
check_variable_set "$1" "Service" || return 1
dcexec $1 sh;
}
function dce_bash() {
check_variable_set "$1" "Service" || return 1
dcexec $1 bash
}
function dce_command() {
check_variable_set "$1" "Service" || return 1
check_variable_set "$2" "Command" || return 1
dcexec $1 sh -c "${@:2}";
}
function dcr() {
check_variable_set "$1" "Service" || return 1
dcrun $1 sh
}
function dcr_bash() {
check_variable_set "$1" "Service" || return 1
dcrun $1 bash
}
function dcr_command() {
check_variable_set "$1" "Service" || return 1
check_variable_set "$2" "Command" || return 1
dcrun $1 sh -c "${@:2}"
}
function dcl() {
check_variable_set "$1" "Service" || return 1
dc logs -f $1
}
function dc_restart() {
check_variable_set "$1" "Service" || return 1
dc restart $1
}
alias docker_ips="docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \$(docker ps -aq)"
alias docker_networks="docker network ls"
alias docker_containers="docker container ls"
alias docker_containers_all="docker_containers -a"
function docker_network_connect_to_container() {
check_variable_set "$1" "Network" || return 1
check_variable_set "$2" "Container" || return 1
docker network connect $1 $2
}
function docker_network_disconnect_from_container() {
check_variable_set "$1" "Network" || return 1
check_variable_set "$2" "Container" || return 1
docker network disconnect --force $1 $2
}
function docker_logs_ui() {
python3 -m webbrowser http://localhost:8888
docker run --rm --name docker_logs_ui --volume=/var/run/docker.sock:/var/run/docker.sock -p 8888:8080 amir20/dozzle:latest --no-analytics=true
}
function docker_logs_container() {
check_variable_set "$1" "Container" || return 1
docker logs -f $1
}
function docker_container_by_name() {
check_variable_set "$1" "Name" || return 1
docker ps --filter name=$1 -q --no-trunc
}
function docker_stop_container() {
check_variable_set "$1" "Container" || return 1
docker stop $1
}
function docker_stop_container_by_name() {
check_variable_set "$1" "Name" || return 1
docker_stop_container $(docker_container_by_name $1)
}
function docker_stop_containers_all() {
docker_stop_container $(docker ps -a -q)
}
function docker_remove_container() {
check_variable_set "$1" "Container" || return 1
docker rm $1
}
function docker_remove_containers_all() {
docker_remove_container $(docker ps -a -q)
}
function docker_run_it() {
check_variable_set "$1" "Image" || return 1
docker run -it "${@:2}" $1 sh
}
function docker_run_it_bash() {
check_variable_set "$1" "Image" || return 1
docker run -it "${@:2}" $1 bash
}
function docker_run_it_with_network_link() {
check_variable_set "$1" "Image" || return 1
check_variable_set "$2" "Network" || return 1
check_variable_set "$3" "Container" || return 1
check_variable_set "$4" "Host" || return 1
docker run -it "${@:5}" --net=$2 --link=$3:$4 $1 sh
}
function docker_run_it_with_network_link_bash() {
check_variable_set "$1" "Image" || return 1
check_variable_set "$2" "Network" || return 1
check_variable_set "$3" "Container" || return 1
check_variable_set "$4" "Host" || return 1
docker run -it "${@:5}" --net=$2 --link=$3:$4 $1 bash
}
function docker_run_it_entrypoint() {
check_variable_set "$1" "Image" || return 1
check_variable_set "$2" "Entrypoint" || return 1
check_variable_set "$3" "Entrypoint arguments" || return 1
docker run -it --entrypoint $2 "${@:4}" $1 $3
}
function docker_exec_it() {
check_variable_set "$1" "Name" || return 1
docker exec -it "${@:2}" $(docker_container_by_name $1) sh
}
function docker_exec_it_bash() {
check_variable_set "$1" "Name" || return 1
docker exec -it "${@:2}" $(docker_container_by_name $1) bash
}
# kubectl
function is_kube_valid() {
return $(which kubectl > /dev/null && ! test -n "$(find ~/.kube -maxdepth 1 -name '*-conf' -print -quit)" && kube_context &> /dev/null && [ $? -eq 0 ]);
}
if is_kube_valid; then
KUBECONFIG=;
for file in ~/.kube/*-conf; do
[ -f $file ] && KUBECONFIG="$KUBECONFIG$file:";
done;
export KUBECONFIG=$KUBECONFIG
if [ ! -f ~/.kube/namespace.save &> /dev/null ]; then
touch ~/.kube/namespace.save
echo "default" > ~/.kube/namespace.save
fi
KUBE_NAMESPACE=$(cat ~/.kube/namespace.save)
fi
alias kube_context="kubectl config current-context"
function kube_context_change() {
check_variable_set "$1" "Context" || return 1
kubectl config use-context $1
}
function kube_pods() {
kubectl -n ${KUBE_NAMESPACE} get pod -o go-template='{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}'
}
function kube_pod_by_app() {
check_variable_set "$1" "App" || return 1
kubectl -n ${KUBE_NAMESPACE} get pod --selector=app=$1 -o go-template='{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}'
}
function kube_cronjobs() {
kubectl -n ${KUBE_NAMESPACE} get cronjob ${@:1}
}
alias kube_cronjobs_watch="kube_cronjobs -w"
function kube_jobs() {
kubectl -n ${KUBE_NAMESPACE} get job ${@:1}
}
alias kube_jobs_watch="kube_jobs -w"
function kube_jobs() {
kubectl -n ${KUBE_NAMESPACE} get job ${@:1}
}
function kube_top_pods_by_app() {
check_variable_set "$1" "App" || return 1
kubectl -n ${KUBE_NAMESPACE} top pod --selector=app=$1
}
function kube_top_pod_by_pod() {
check_variable_set "$1" "Pod" || return 1
kubectl -n ${KUBE_NAMESPACE} top pod $1
}
function kube_cronjob_create_manual() {
check_variable_set "$1" "Cronjob name" || return 1
check_variable_set "$2" "Job name" || return 1
kubectl -n ${KUBE_NAMESPACE} create job --from=cronjob/$1 $2
}
function kube_port_forward_app_remotePort_localPort() {
check_variable_set "$1" "App" || return 1
check_variable_set "$2" "Remote port" || return 1
check_variable_set "$3" "Local port" || return 1
kube_pods=( $(kube_pod_by_app $1) )
check_array_not_empty ${kube_pods} || return 1
for kube_pod in "${kube_pods[@]}"; do
echo "Port forwarding $kube_pod"
kubectl -n ${KUBE_NAMESPACE} port-forward $kube_pod $3:$2 ${@:4}
done
}
function kube_port_forward_app_remotePort_localPort_external() {
check_variable_set "$1" "App" || return 1
check_variable_set "$2" "Remote port" || return 1
check_variable_set "$3" "Local port" || return 1
kube_pods=( $(kube_pod_by_app $1) )
check_array_not_empty ${kube_pods} || return 1
for kube_pod in "${kube_pods[@]}"; do
echo "Port forwarding $kube_pod"
kubectl -n ${KUBE_NAMESPACE} port-forward --address 0.0.0.0 $kube_pod $3:$2 ${@:4}
done
}
function kube_port_forward_pod_remotePort_localPort() {
check_variable_set "$1" "Pod" || return 1
check_variable_set "$2" "Remote port" || return 1
check_variable_set "$3" "Local port" || return 1
kubectl -n ${KUBE_NAMESPACE} port-forward $1 $3:$2 ${@:4}
}
function kube_port_forward_pod_remotePort_localPort_external() {
check_variable_set "$1" "Pod" || return 1
check_variable_set "$2" "Remote port" || return 1
check_variable_set "$3" "Local port" || return 1
kubectl -n ${KUBE_NAMESPACE} port-forward --address 0.0.0.0 $1 $3:$2 ${@:4}
}
function kube_logs_by_pod() {
check_variable_set "$1" "Pod" || return 1
container=$(if [ -z $2 ]; then echo $1; else echo $2; fi)
follow_or_tail=$(if [ -z $3 ]; then echo "-f"; else echo "--tail=$3"; fi)
echo "Viewing logs of $1"
kubectl -n ${KUBE_NAMESPACE} logs $follow_or_tail --container $container $1 ${@:4}
}
function kube_logs_by_app() {
check_variable_set "$1" "App" || return 1
follow_or_tail=$(if [ -z $2 ]; then echo "-f"; else echo "--tail=$2"; fi)
kube_pods=( $(kube_pod_by_app $1) )
check_array_not_empty ${kube_pods} || return 1
for kube_pod in "${kube_pods[@]}"; do
kube_logs_by_pod $kube_pod $container $follow_or_tail ${@:3}
done
}
function kube_logs_by_app_all() {
check_variable_set "$1" "app" || return 1
follow_or_tail=$(if [ -z $2 ]; then echo "-f"; else echo "--tail=$2"; fi)
kubectl -n ${KUBE_NAMESPACE} logs $follow_or_tail -l app=$1 ${@:3}
}
function kube_exec_it_pod() {
check_variable_set "$1" "Pod" || return 1
container=$(if [ -z $2 ]; then echo $1; else echo $2; fi)
command=$(if [ -z $3 ]; then echo "sh"; else echo $3; fi)
echo "Exec in $kube_pod"
kubectl -n ${KUBE_NAMESPACE} exec -it $1 --container $container -- $command
}
function kube_exec_it_app() {
check_variable_set "$1" "App" || return 1
container=$(if [ -z $2 ]; then echo $1; else echo $2; fi)
command=$(if [ -z $3 ]; then echo "sh"; else echo $3; fi)
kube_pods=( $(kube_pod_by_app $1) )
check_array_not_empty ${kube_pods} || return 1
for kube_pod in "${kube_pods[@]}"; do
kube_exec_it_pod $kube_pod $container $command
done
}
function kube_details_by_pod() {
check_variable_set "$1" "Pod" || return 1
echo "Viewing details of $1"
kubectl -n ${KUBE_NAMESPACE} describe pod $1
}
function kube_details_by_app() {
check_variable_set "$1" "App" || return 1
kube_pods=( $(kube_pod_by_app $1) )
check_array_not_empty ${kube_pods} || return 1
for kube_pod in "${kube_pods[@]}"; do
kube_details_by_pod $kube_pod
done
}
function kube_copy_file_from_pod() {
check_variable_set "$1" "Pod" || return 1
check_variable_set "$2" "Remote path" || return 1
check_variable_set "$3" "Local path" || return 1
kubectl -n ${KUBE_NAMESPACE} cp $1:$2 $3
}
function kube_secret_to_yaml() {
check_variable_set "$1" "Secret" || return 1
kubectl -n ${KUBE_NAMESPACE} get secret -o yaml $1
}
function kube_configmap_to_yaml() {
check_variable_set "$1" "ConfigMap" || return 1
kubectl -n ${KUBE_NAMESPACE} get configmap -o yaml $1
}
function kube_restart_deployment() {
check_variable_set "$1" "Deployment" || return 1
kubectl -n ${KUBE_NAMESPACE} rollout restart deployment $1
}
# telepresence
alias tp_mitcp="telepresence --method inject-tcp"
# console output
if [ -f ~/.bash_custom &> /dev/null ]; then
source ~/.bash_custom
fi
force_color_prompt=yes
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then debian_chroot=$(cat /etc/debian_chroot); fi
case "$TERM" in
xterm-color|*-256color) color_prompt=yes;;
esac
if [ -n "$force_color_prompt" ]; then if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then color_prompt=yes; else color_prompt=; fi; fi
# "username:[cluster/namespace][git_branch]~/directory$ "
# needs to be a function to be refreshed
function prompt_git() {
is_folder_git && echo "[$(gb)]";
}
function prompt_kube() {
is_kube_valid && echo "[$(kube_context)/${KUBE_NAMESPACE}]";
}
if [ -n "$BASH_VERSION" ]; then
PS1='${debian_chroot:+($debian_chroot)}'
if [ "$color_prompt" != yes ]; then
PS1="$PS1\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;90m\]\$(prompt_kube)\[\033[00m\]\[\033[01;31m\]\$(prompt_git)\[\033[00m\]\[\033[01;34m\]\w\[\033[00m\]"
else
PS1="$PS1\u:\$(prompt_kube)\$(prompt_kube)\w"
fi
PS1="$PS1\$ "
elif [ -n "$ZSH_VERSION" ]; then
setopt PROMPT_SUBST
if [ "$color_prompt" = yes ]; then
PS1=$'%{\e[1;32m%}%n%{\e[0m%}:%{\e[1;90m%}$(prompt_kube)%{\e[0m%}%{\e[1;31m%}$(prompt_git)%{\e[0m%}%{\e[1;34m%}%~%{\e[0m%}$ '
else
PS1='%n:$(prompt_kube)$(prompt_git)%~$ '
fi
fi
unset color_prompt force_color_prompt is_folder_git prompt_git is_kube_valid prompt_kube
function unrar_it() {
RAND_DIR=$(tr -dc A-Za-z0-9 </dev/urandom | head -c 13; echo)
RAND_DIR="/tmp/$RAND_DIR"
echo "Unrar in $RAND_DIR"
mkdir $RAND_DIR && unrar e *.rar $RAND_DIR
# rename files with _tmp
find $RAND_DIR -mindepth 1 -exec mv '{}' '{}'_tmp \;
echo "Moving extracted files"
mv $RAND_DIR/* $PWD
rm -rf $RAND_DIR
# rename files without _tmp
find $PWD -mindepth 1 -iname '*_tmp' -exec rename 's/_tmp//' '{}' \;
echo "Done"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment