Naposledy aktivní 1 month ago

sam's Avatar sam revidoval tento gist 1 month ago. Přejít na revizi

1 file changed, 1 insertion, 1 deletion

brut.sh

@@ -130,7 +130,7 @@ if [ $# -eq 1 ] && [ -n "${VERSION:-}" ] && [ "$1" = "--version" ]; then
130 130 fi
131 131
132 132
133 - # When invoked as `--- <COMMAND> ...`, run that command and exit
133 + # When invoked as `--- <COMMAND> ...`, run that exact command and exit
134 134 if [ "${1:-}" = "---" ]; then
135 135 [ $# -gt 1 ] || usage
136 136 shift

sam's Avatar sam revidoval tento gist 1 month ago. Přejít na revizi

1 file changed, 3 insertions, 3 deletions

brut.sh

@@ -63,7 +63,7 @@ executables() {
63 63 for ns in $(namespaces "$NAME-"); do
64 64 set -- "$@" \! -name "$ns-*"
65 65 done
66 - unset ns
66 +
67 67 searchpath -name "$NAME-*" "$@" | awk -F / '!a[$NF]++'
68 68 }
69 69
@@ -101,7 +101,7 @@ searchpath() {
101 101 dirs="$dirs:$dir"
102 102 done
103 103 set -- ${dirs#:} \( \! -name '*' "$@"
104 - unset IFS dir dirs
104 + unset IFS
105 105 } 2>/dev/null
106 106
107 107 find -H "$@" 2>/dev/null \
@@ -178,4 +178,4 @@ if [ -n "$COMMAND" ]; then
178 178 error "$0" "$COMMAND: command not found" || exit 127
179 179 fi
180 180
181 - usage
181 + usage

sam's Avatar sam revidoval tento gist 1 month ago. Přejít na revizi

1 file changed, 1 insertion, 1 deletion

brut.sh

@@ -63,7 +63,7 @@ executables() {
63 63 for ns in $(namespaces "$NAME-"); do
64 64 set -- "$@" \! -name "$ns-*"
65 65 done
66 -
66 + unset ns
67 67 searchpath -name "$NAME-*" "$@" | awk -F / '!a[$NF]++'
68 68 }
69 69

sam's Avatar sam revidoval tento gist 1 month ago. Přejít na revizi

1 file changed, 6 insertions, 5 deletions

brut.sh

@@ -93,12 +93,15 @@ resolve() {
93 93
94 94 searchpath() {
95 95 { IFS=:
96 + dirs=
96 97 set -- \) -o -prune "$@"
97 98 for dir in $PATH; do
99 + [ -d "$dir" ] || continue
98 100 set -- -o -path "$dir" "$@"
101 + dirs="$dirs:$dir"
99 102 done
100 - set -- $PATH \( \! -name '*' "$@"
101 - unset IFS
103 + set -- ${dirs#:} \( \! -name '*' "$@"
104 + unset IFS dir dirs
102 105 } 2>/dev/null
103 106
104 107 find -H "$@" 2>/dev/null \
@@ -143,7 +146,6 @@ index=0
143 146
144 147 for arg; do
145 148 index=$((index+1))
146 -
147 149 case "$arg" in
148 150 -* ) ;;
149 151 ?*--?* ) [ -n "$COMMAND" ] || usage ;;
@@ -153,7 +155,6 @@ for arg; do
153 155 continue
154 156 fi
155 157 esac
156 -
157 158 args="$args"' "${'"$index"'}"'
158 159 done
159 160
@@ -177,4 +178,4 @@ if [ -n "$COMMAND" ]; then
177 178 error "$0" "$COMMAND: command not found" || exit 127
178 179 fi
179 180
180 - usage
181 + usage

sam's Avatar sam revidoval tento gist 1 month ago. Přejít na revizi

1 file changed, 5 insertions, 5 deletions

brut.sh

@@ -68,14 +68,14 @@ executables() {
68 68 }
69 69
70 70 flatten() {
71 - "$@" | xargs -r printf "%s "
71 + "$@" | { tr "\n" " "; printf "\n"; }
72 72 }
73 73
74 74 invocation() {
75 75 { printf "%s\n" "$PROGRAM_NAME"; namespaces; } \
76 - | awk -v i=-1 -v name="$NAME" \
77 - 'index(name, $0 "-") == 1 { o = o " " substr($0, i+2); i = length($0) }
78 - END { print substr(o " " substr(name, i+2), 2) }'
76 + | sort -r | awk -v name="$NAME" \
77 + 'index(name, $0 "-") == 1 { name = $0 " " substr(name, length($0) + 2) }
78 + END { print name }'
79 79 }
80 80
81 81 namespaces() {
@@ -177,4 +177,4 @@ if [ -n "$COMMAND" ]; then
177 177 error "$0" "$COMMAND: command not found" || exit 127
178 178 fi
179 179
180 - usage
180 + usage

sam's Avatar sam revidoval tento gist 1 month ago. Přejít na revizi

1 file changed, 180 insertions

brut.sh(vytvořil soubor)

@@ -0,0 +1,180 @@
1 + #!/bin/sh
2 + # Brutal Router for Unix Tools - https://brut.sh
3 + set -eu
4 +
5 +
6 + # Find ourselves
7 + OLDENV="$(export -p)"
8 + SELF="$(realpath "$0")"
9 + NAME="${0##*/}"
10 + PROGRAM_NAME="${SELF##*/}"
11 + ROOT="${SELF%/*/*}"
12 +
13 +
14 + # Set up the environment
15 + LIB="$ROOT/lib/$NAME"
16 + LIBEXEC="$ROOT/libexec"
17 + SHARE="$ROOT/share/$NAME"
18 + VENDOR="$SHARE/vendor"
19 +
20 + PATH="$LIB:$LIBEXEC:$VENDOR:$PATH"
21 + export SELF
22 +
23 + USAGE="<COMMAND>"
24 + unset VERSION
25 +
26 +
27 + # ---
28 + # Define shared helpers
29 +
30 + error() {
31 + NAME="${1##*/}"
32 + shift
33 +
34 + printf "%s: " "$(invocation)"
35 + printf "%s\n" "$@"
36 + return 1
37 + } >&2
38 +
39 + usage() {
40 + if [ $# -eq 0 ]; then
41 + set -- "$NAME" "${USAGE:-}" "commands: $(flatten commands)"
42 + fi
43 +
44 + NAME="${1##*/}"
45 + shift
46 +
47 + printf "usage: %s " "$(invocation)"
48 + printf "%s\n" "$@"
49 + return 1
50 + } >&2
51 +
52 + version() {
53 + printf "%s %s\n" "$PROGRAM_NAME" "$VERSION"
54 + }
55 +
56 + # ---
57 +
58 + commands() {
59 + executables | sed -e "s/^.*\/$NAME-//" | sort
60 + }
61 +
62 + executables() {
63 + for ns in $(namespaces "$NAME-"); do
64 + set -- "$@" \! -name "$ns-*"
65 + done
66 +
67 + searchpath -name "$NAME-*" "$@" | awk -F / '!a[$NF]++'
68 + }
69 +
70 + flatten() {
71 + "$@" | xargs -r printf "%s "
72 + }
73 +
74 + invocation() {
75 + { printf "%s\n" "$PROGRAM_NAME"; namespaces; } \
76 + | awk -v i=-1 -v name="$NAME" \
77 + 'index(name, $0 "-") == 1 { o = o " " substr($0, i+2); i = length($0) }
78 + END { print substr(o " " substr(name, i+2), 2) }'
79 + }
80 +
81 + namespaces() {
82 + searchpath -type l -name "${1:-$PROGRAM_NAME-}*" \
83 + -exec sh -c '[ "$0" = "$(realpath "$1")" ] 2>/dev/null' "$SELF" {} \; \
84 + | sed -e "s/^.*\///" | sort -u
85 + }
86 +
87 + resolve() {
88 + case "${1:-}" in
89 + *-* ) executables -name "$NAME-$1" ;;
90 + ?* ) searchpath -name "$NAME-$1" | head -n 1
91 + esac | grep .
92 + }
93 +
94 + searchpath() {
95 + { IFS=:
96 + set -- \) -o -prune "$@"
97 + for dir in $PATH; do
98 + set -- -o -path "$dir" "$@"
99 + done
100 + set -- $PATH \( \! -name '*' "$@"
101 + unset IFS
102 + } 2>/dev/null
103 +
104 + find -H "$@" 2>/dev/null \
105 + \( -perm -001 -o -perm -010 -o -perm -100 \) \
106 + \( -type f -o -type l \) \
107 + \! -name "?*--?*" \
108 + -print || true
109 + }
110 +
111 + unenv() {
112 + exec env -i sh -euc 'eval "$1"; shift; exec "$@"' "$0" "$OLDENV" "$@"
113 + }
114 +
115 + # ---
116 +
117 +
118 + # Load _init.sh, if it exists
119 + if [ -r "$LIB"/_init.sh ]; then
120 + . "$LIB"/_init.sh
121 + fi
122 +
123 +
124 + # Rewrite `--version` to `--- version`
125 + if [ $# -eq 1 ] && [ -n "${VERSION:-}" ] && [ "$1" = "--version" ]; then
126 + set -- --- version
127 + fi
128 +
129 +
130 + # When invoked as `--- <COMMAND> ...`, run that command and exit
131 + if [ "${1:-}" = "---" ]; then
132 + [ $# -gt 1 ] || usage
133 + shift
134 + "$@"
135 + exit
136 + fi
137 +
138 +
139 + # Scan the argument list to find the command name
140 + COMMAND=
141 + args=
142 + index=0
143 +
144 + for arg; do
145 + index=$((index+1))
146 +
147 + case "$arg" in
148 + -* ) ;;
149 + ?*--?* ) [ -n "$COMMAND" ] || usage ;;
150 + * )
151 + if [ -z "$COMMAND" ]; then
152 + COMMAND="$arg"
153 + continue
154 + fi
155 + esac
156 +
157 + args="$args"' "${'"$index"'}"'
158 + done
159 +
160 +
161 + # Match the command name to an executable in the current namespace;
162 + # if one exists, exec it
163 + if executable="$(resolve "$COMMAND")"; then
164 + eval "set --$args"
165 + exec "$executable" "$@"
166 + fi
167 +
168 +
169 + # No matching executable; load _unhandled.sh, if it exists
170 + if [ -r "$LIB"/_unhandled.sh ]; then
171 + . "$LIB"/_unhandled.sh
172 + fi
173 +
174 +
175 + # No matching command or no command specified
176 + if [ -n "$COMMAND" ]; then
177 + error "$0" "$COMMAND: command not found" || exit 127
178 + fi
179 +
180 + usage
Novější Starší