我正在构建一个小的shell脚本,用于在各种unix系统上查找cat / man页面...在bash中,我可以通过这样做构建所有可能的路径:
# default search paths
default=$(echo /usr/{share, local, dpkg, XR11}/man/{man, cat}{1..8})
for path in $default
do
...
done
不幸的是,我被迫使用sh ...我可以使用循环构建路径,但这看起来真的很难看......是否有更整洁/更短的方式?
答案 0 :(得分:2)
在我的Linux系统上,“man -w”打印nroff源文件的位置而不是其内容。这样你就可以使用man的内部搜索来查找文件 - 就像命令行上的用户一样。
有关详细信息,请参阅“man man”。
答案 1 :(得分:1)
这并不可怕:
for dir in share local pdkg XR11; do
for type in man cat; do
for n in 1 2 3 4 5 6 7 8; do
path="/usr/${dir}/man/${type}$n"
# ...
done
done
done
或者甚至,虽然它不是DRY,但它是明确且可读的
prefixes="
/usr/share/man/man /usr/share/man/cat
/usr/local/man/man /usr/local/man/cat
/usr/pdkg/man/man /usr/pdkg/man/cat
/usr/XR11/man/man /usr/XR11/man/cat
"
for prefix in $prefixes; do
for n in 1 2 3 4 5 6 7 8; do
path="${prefix}$n"
# ...
done
done
答案 2 :(得分:1)
你可以使用find
find /usr/share /usr/local /usr/dpkg /usr/XR11 -type d \( -name "man[0-9]" -o -name "cat[0-9]" -o -name "cat" -o -name "man" \)
答案 3 :(得分:0)
鉴于Bourne shell,我可能会使用:
for path in `ls -d /usr/*/man/[mc]a[tn][1-8]`
do
if [ -d $path ]
then ...
fi
done
如果有人恶意创建目录/usr/spoof/man/man3
,/usr/share/man/mat1
或/usr/dpkg/man/can2
,这只会让你误入歧途,这不太可能让我不担心。
答案 4 :(得分:0)
您可以使用find
:
find /usr/share /usr/local /usr/dpkg /usr/XR11 -type d -regex '.*/man/\(cat\|man\)[1-8]$'
在我的系统上,我有一堆本地化的man
页面会被上面排除,所以你可以这样做:
find /usr/share /usr/local /usr/dpkg /usr/XR11 -type d -regex '.*/\(cat\|man\)[1-8]$'