Last active
March 9, 2022 14:05
-
-
Save tinkernels/59e1959756dbf645ec9a67c221acd08c to your computer and use it in GitHub Desktop.
Get the shell file real path itself when executed or sourced.
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 | |
echo "---------------- GET SELF PATH ----------------" | |
echo "NOW \$(pwd) >>> $(pwd)" | |
ORIGINAL_PWD_GETSELFPATHVAR=$(pwd) | |
echo "NOW \$0 >>> $0" | |
echo "NOW \$_ >>> $_" | |
echo "NOW \${0##*/} >>> ${0##*/}" | |
if test -n "$BASH"; then | |
echo "RUNNING IN BASH..." | |
SH_FILE_RUN_PATH_GETSELFPATHVAR=${BASH_SOURCE[0]} | |
elif test -n "$ZSH_NAME"; then | |
echo "RUNNING IN ZSH..." | |
SH_FILE_RUN_PATH_GETSELFPATHVAR=${(%):-%x} | |
elif test -n "$KSH_VERSION"; then | |
echo "RUNNING IN KSH..." | |
SH_FILE_RUN_PATH_GETSELFPATHVAR=${.sh.file} | |
else | |
echo "RUNNING IN DASH OR OTHERS ELSE..." | |
SH_FILE_RUN_PATH_GETSELFPATHVAR=$(lsof -p $$ -Fn0 | tr -d '\0' | grep "${0##*/}" | tail -1 | sed 's/^[^\/]*//g') | |
fi | |
echo "EXECUTING FILE PATH: $SH_FILE_RUN_PATH_GETSELFPATHVAR" | |
cd "$(dirname "$SH_FILE_RUN_PATH_GETSELFPATHVAR")" || return 1 | |
SH_FILE_RUN_BASENAME_GETSELFPATHVAR=$(basename "$SH_FILE_RUN_PATH_GETSELFPATHVAR") | |
# Iterate down a (possible) chain of symlinks as lsof of macOS doesn't have -f option. | |
while [ -L "$SH_FILE_RUN_BASENAME_GETSELFPATHVAR" ]; do | |
SH_FILE_REAL_PATH_GETSELFPATHVAR=$(readlink "$SH_FILE_RUN_BASENAME_GETSELFPATHVAR") | |
cd "$(dirname "$SH_FILE_REAL_PATH_GETSELFPATHVAR")" || return 1 | |
SH_FILE_RUN_BASENAME_GETSELFPATHVAR=$(basename "$SH_FILE_REAL_PATH_GETSELFPATHVAR") | |
done | |
# Compute the canonicalized name by finding the physical path | |
# for the directory we're in and appending the target file. | |
SH_SELF_PATH_DIR_RESULT=$(pwd -P) | |
SH_FILE_REAL_PATH_GETSELFPATHVAR=$SH_SELF_PATH_DIR_RESULT/$SH_FILE_RUN_BASENAME_GETSELFPATHVAR | |
echo "EXECUTING REAL PATH: $SH_FILE_REAL_PATH_GETSELFPATHVAR" | |
echo "EXECUTING FILE DIR: $SH_SELF_PATH_DIR_RESULT" | |
cd "$ORIGINAL_PWD_GETSELFPATHVAR" || return 1 | |
unset ORIGINAL_PWD_GETSELFPATHVAR | |
unset SH_FILE_RUN_PATH_GETSELFPATHVAR | |
unset SH_FILE_RUN_BASENAME_GETSELFPATHVAR | |
unset SH_FILE_REAL_PATH_GETSELFPATHVAR | |
echo "---------------- GET SELF PATH ----------------" | |
# USE $SH_SELF_PATH_DIR_RESULT BEBLOW |
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 | |
# ---------------- GET SELF PATH ---------------- | |
ORIGINAL_PWD_GETSELFPATHVAR=$(pwd) | |
if test -n "$BASH"; then SH_FILE_RUN_PATH_GETSELFPATHVAR=${BASH_SOURCE[0]} | |
elif test -n "$ZSH_NAME"; then SH_FILE_RUN_PATH_GETSELFPATHVAR=${(%):-%x} | |
elif test -n "$KSH_VERSION"; then SH_FILE_RUN_PATH_GETSELFPATHVAR=${.sh.file} | |
else SH_FILE_RUN_PATH_GETSELFPATHVAR=$(lsof -p $$ -Fn0 | tr -d '\0' | grep "${0##*/}" | tail -1 | sed 's/^[^\/]*//g') | |
fi | |
cd "$(dirname "$SH_FILE_RUN_PATH_GETSELFPATHVAR")" || return 1 | |
SH_FILE_RUN_BASENAME_GETSELFPATHVAR=$(basename "$SH_FILE_RUN_PATH_GETSELFPATHVAR") | |
while [ -L "$SH_FILE_RUN_BASENAME_GETSELFPATHVAR" ]; do | |
SH_FILE_REAL_PATH_GETSELFPATHVAR=$(readlink "$SH_FILE_RUN_BASENAME_GETSELFPATHVAR") | |
cd "$(dirname "$SH_FILE_REAL_PATH_GETSELFPATHVAR")" || return 1 | |
SH_FILE_RUN_BASENAME_GETSELFPATHVAR=$(basename "$SH_FILE_REAL_PATH_GETSELFPATHVAR") | |
done | |
SH_SELF_PATH_DIR_RESULT=$(pwd -P) | |
SH_FILE_REAL_PATH_GETSELFPATHVAR=$SH_SELF_PATH_DIR_RESULT/$SH_FILE_RUN_BASENAME_GETSELFPATHVAR | |
cd "$ORIGINAL_PWD_GETSELFPATHVAR" || return 1 | |
unset ORIGINAL_PWD_GETSELFPATHVAR SH_FILE_RUN_PATH_GETSELFPATHVAR SH_FILE_RUN_BASENAME_GETSELFPATHVAR SH_FILE_REAL_PATH_GETSELFPATHVAR | |
# ---------------- GET SELF PATH ---------------- | |
# USE $SH_SELF_PATH_DIR_RESULT BEBLOW |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment