Last active
December 26, 2023 11:55
-
-
Save notpushkin/6e9b2e232b9cd5e1e35600c5e79b87a6 to your computer and use it in GitHub Desktop.
dman on macOS – read man pages from manpages.debian.org
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
#!/bin/sh | |
set -e | |
# dman - read man pages from manpages.debian.org | |
# Patched for macOS by Alexander Pushkov <alexander@notpushk.in> | |
############################################################################### | |
# Copyright (C) 2008 Canonical Ltd. | |
# | |
# This code was originally written by Dustin Kirkland <kirkland@ubuntu.com>, | |
# based on a framework by Kees Cook <kees@ubuntu.com>. | |
# | |
# It was later modified for Debian, for use in the debian-goodies package, | |
# by Antoine Beaupré <anarcat@debian.org>, Axel Beckert <abe@deuxchevaux.org> | |
# and Javier Fernández-Sanguino <jfs@debian.org> | |
# | |
# This program is free software: you can redistribute it and/or modify | |
# it under the terms of the GNU General Public License as published by | |
# the Free Software Foundation, either version 3 of the License, or | |
# (at your option) any later version. | |
# | |
# This program is distributed in the hope that it will be useful, | |
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
# GNU General Public License for more details. | |
# | |
# You should have received a copy of the GNU General Public License | |
# along with this program. If not, see <http://www.gnu.org/licenses/>. | |
# | |
# On Debian-based systems, the complete text of the GNU General Public | |
# License can be found in /usr/share/common-licenses/GPL-3 | |
############################################################################### | |
# default to stable since we're not on an LSB compliant system | |
DISTRIB_CODENAME=${DISTRIB_CODENAME:-stable} | |
usage() | |
{ | |
echo "Usage: $0 [ --release suite ] man-page <man-arguments>" | |
} | |
download_man(){ | |
url=$1 | |
file=$2 | |
curl $CURLOPTS "$url" >"$file" 2>/dev/null | |
if ! [ -s "$file" ] || | |
egrep -q "<title>403.*Forbidden</title>" "$file" || | |
egrep -q "<h1>Manpage not found</h1>" "$file" ; then | |
return 1 | |
fi | |
return 0 | |
} | |
# Process command line options | |
while true; do | |
case "$1" in | |
--release) | |
DISTRIB_CODENAME="$2" | |
shift 2 | |
;; | |
--help) | |
usage | |
exit 0 | |
;; | |
*) | |
break | |
;; | |
esac | |
done | |
PAGE=`echo "$@" | awk '{print $NF}'` | |
MAN_ARGS=`echo "$@" | sed "s/\$PAGE$//"` | |
# Sanity checks | |
if [ ! -x "`which curl`" ] ; then | |
echo "ERROR: $0 - cannot find curl - exiting" | |
exit 1 | |
fi | |
if [ -z "$PAGE" ] ; then | |
echo "ERROR: No manpage provided - exiting" | |
usage | |
exit 1 | |
fi | |
# PROGRAM OPTIONS | |
CURLOPTS="-s -L" # -s for silent, -L to follow redirects | |
# Mirror support of man's languages | |
if [ ! -z "$LANG" ]; then | |
LOCALE=$(echo $LANG | sed 's/_.*$//') | |
LOCDOT=".$LOCALE" | |
fi | |
if [ ! -z "$LC_MESSAGES" ]; then | |
LOCALE="$LC_MESSAGES" | |
LOCDOT=".$LOCALE" | |
fi | |
if echo $LOCALE | grep -E -q "^(C|en)"; then | |
LOCALE="" | |
LOCDOT=".en" | |
fi | |
BASE_URL="https://dyn.manpages.debian.org" | |
mandir=`mktemp -d dman.XXXXXX` | |
trap "rm -rf $mandir" EXIT HUP INT QUIT TERM | |
man="$mandir/$PAGE" | |
TESTED_URLS="" | |
# be careful not to add too many entries in this loop, as each hit can | |
# take some time for the round-trip | |
for URL in "$BASE_URL/$DISTRIB_CODENAME/$PAGE$LOCDOT.gz" \ | |
"$BASE_URL/$DISTRIB_CODENAME/$PAGE.en.gz" \ | |
"$BASE_URL/$DISTRIB_CODENAME/$PAGE.gz" \ | |
"$BASE_URL/$PAGE$LOCDOT.gz" \ | |
"$BASE_URL/$PAGE.en.gz" \ | |
"$BASE_URL/$PAGE.gz" \ | |
do | |
if download_man $URL $man; then | |
man $MAN_ARGS "$man" || true | |
exit 0 | |
fi | |
# Continue in case of failure, take note of tested URL | |
if [ -z "$TESTED_URLS" ] ; then | |
TESTED_URLS="$URL" | |
else | |
TESTED_URLS="$TESTED_URLS, $URL" | |
fi | |
done | |
echo "$0: not found. Tried: $TESTED_URLS" 1>&1 | |
exit 1 |
Спасибо за ответ. На Убунте ман работает тоже если просто путь указать. Ну и --tmpdir стрёмная затея.
Так что эти изменения можно смело пушить.
Если вам лень я могу сам пул реквест отправить.
Пока обедал проверил скрипт с мака жены и сделал ПР
https://salsa.debian.org/debian/debian-goodies/-/merge_requests/7
Тут объяснение зачем нужен --tmpdir
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=861611
Но есть простое решение просто использовать -t
@stokito 🔥, спасибо!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@stokito
Убрал
-l
вman $MAN_ARGS -l "$man" || true
. На маке и *BSD-l
не поддерживается, но если в аргументе есть слеш, он трактуется как путь к манпейджу (например, FreeBSDman(1)
, раздел Displaying Specific Manual Files).Убрал
--tmpdir
у mktemp (тоже не поддерживается).Не знаю, насколько имеет смысл добавлять эти изменения в goodies, особенно учитывая что для man нужно будет добавлять какую-то проверку, чтобы работало и на линуксе (где всё ещё нужен
-l
), и на маке.(В debian-goodies ещё вот эти два патча есть, которых нет у меня — с ними должно быть всё ок, сейчас проверю и добавлю к себе.)