forked from oldratlee/useful-scripts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrp
executable file
·124 lines (105 loc) · 2.84 KB
/
rp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/bin/bash
# @Function
# convert to Relative Path.
#
# @Usage
# # if 1 argument, print relative path to current dir.
# $ ./rp /etc/apache2/httpd.conf
# # if more than 1 argument, print relative path to last argument.
# $ ./rp a.txt ../b.txt /etc/passwd /etc/apache2
#
# @online-doc https://github.com/oldratlee/useful-scripts/blob/dev-2.x/docs/shell.md#-ap-and-rp
# @author Jerry Lee (oldratlee at gmail dot com)
set -eEuo pipefail
# NOTE: DO NOT declare var PROG as readonly in ONE line!
PROG="$(basename "$0")"
readonly PROG
readonly PROG_VERSION='2.5.0-dev'
################################################################################
# util functions
################################################################################
# NOTE: $'foo' is the escape sequence syntax of bash
readonly ec=$'\033' # escape char
readonly eend=$'\033[0m' # escape end
readonly nl=$'\n' # new line
colorEcho() {
local color="$1"
shift
# check isatty in bash https://stackoverflow.com/questions/10022323
# if stdout is console, turn on color output.
[ -t 1 ] && echo "${ec}[1;${color}m$*${eend}" || echo "$*"
}
redEcho() {
colorEcho 31 "$@"
}
usage() {
local -r exit_code="${1:-0}"
(($# > 0)) && shift
# shellcheck disable=SC2015
[ "$exit_code" != 0 ] && local -r out=/dev/stderr || local -r out=/dev/stdout
(($# > 0)) && redEcho "$*$nl" >$out
cat >$out <<EOF
Usage: ${PROG} [OPTION]... ARG...
convert to Relative Path.
Example:
${PROG} arg1 arg2
${PROG} */*.py
Options:
-h, --help display this help and exit
-V, --version display version information and exit
EOF
exit "$exit_code"
}
progVersion() {
echo "$PROG $PROG_VERSION"
exit
}
################################################################################
# parse options
################################################################################
declare -a files=()
while [ $# -gt 0 ]; do
case "$1" in
-h | --help)
usage
;;
-V | --version)
progVersion
;;
--)
shift
files=(${files[@]:+"${files[@]}"} "$@")
break
;;
-*)
usage 2 "${PROG}: unrecognized option '$1'"
break
;;
*)
# if not option, treat all follow files as args
files=(${files[@]:+"${files[@]}"} "$@")
break
;;
esac
done
[ "${#files[@]}" -eq 0 ] && {
redEcho "Error: NO argument!" 1>&2
exit 1
}
if [ "${#files[@]}" -eq 1 ]; then
relativeTo=.
else
argc="${#files[@]}"
# Get last argument
relativeTo="${files[argc - 1]}"
files=("${files[@]:0:argc-1}")
fi
[ -f "$relativeTo" ] && relativeTo="$(dirname "$relativeTo")"
readonly files relativeTo
for f in "${files[@]}"; do
! [ -e "$f" ] && {
echo "$f does not exists!"
continue
}
realpath "$f" --relative-to="$relativeTo"
done