הסקריפט הזה משמש אותי כבר כמה זמן, אולי זה יעזור לעוד אנשים פה... (בעיקר לאובססיבים קשים שהמחשבה על כך שיש משהו שהם לא יודעים על משהו לא נותנת להם לישון בלילה...)
השימוש זהה ל-grep, פשוט מריצים עם כל הפרמטרים שהייתם נותנים ל-grep, למשל:
קוד: |
./search-man.sh -iw tcp |
הסקריפט משתמש בתוכנה deroff שצריכה להיות מותקנת, ושיש בה ספק-באג ששובר שורות באמצע כשיש בהן פקודות עיצוב של roff, ולכן מספרי שורות שמופיעים עם -n לא תמיד נכונים (אבל עדיין יכולים להיות שימושיים...)
קוד: |
#!/bin/bash
print_usage_and_exit ()
{
{
echo "error: invalid command-line"
echo "usage: $0 <grep arguments>"
} >&2
exit 2
}
format_page_name ()
{
page_file="$1"
page_base_file="${page_file##*/}"
page_name_and_section="${page_base_file%.gz}"
page_name="${page_name_and_section%.*}"
page_section="${page_name_and_section##*.}"
echo "$page_name($page_section)"
}
# usage: grep_man <page> <grep arguments>
grep_man ()
{
page="$1"
page_name=$(format_page_name "$page")
# skip symlinks
test -L "$page" && return 1
# uncompress, remove comments and references to other manpages, deroff, grep
zcat "$page" | egrep -v '^\.(\\\"|so)' | deroff | grep -H --label=$page_name "${@:2}"
}
# check command-line validity
(echo | grep "$@") >/dev/null 2>/dev/null
test $? -gt 1 && print_usage_and_exit
ok=
for page in /usr/share/man/man*/*
do
grep_man "$page" "$@" && ok=1
done
# return 0 if at least one match was found; otherwise return 1 (same as standard grep)
test -n "$ok"
|