2009-11-23 2 views
0

Я строю небольшой скрипт для поиска кота/страницы человека в широком диапазоне систем Unix ... в Баш, я мог бы построить все возможные пути, делая это:ш - Построить строку, содержащую пути

# default search paths 
default=$(echo /usr/{share, local, dpkg, XR11}/man/{man, cat}{1..8}) 

for path in $default 
do 
    ... 
done 

К сожалению, я вынужден использовать sh ... Я мог бы построить дорожки с петлями, но это выглядело бы очень уродливо ... есть ли более аккуратный/более короткий путь?

+0

Что вы имеете в виду под «ш»? Оригинальная раковина bourne не была вокруг какое-то время. Какая оболочка у вас есть? – bmargulies

+2

@bmargulies: waddya означает? Он (оболочка Bourne) по-прежнему является стандартным для Unix (AIX, HP-UX, Solaris). Не на MacOS X или Linux, конечно, и другие оболочки доступны в AIX, HP-UX, Solaris. Но оболочка Борна по-прежнему является стандартным местом. –

+0

Это для университетского проекта ... сценарий должен иметь возможность работать как можно больше систем unix, поэтому было принято решение использовать sh для большей совместимости backwars – Trollhorn

ответ

2

В моей системе Linux «man -w» печатает местоположение исходного файла nroff вместо его содержимого. Таким образом, вы используете внутренний поиск человека для поиска файлов - точно так же, как пользователь в командной строке.

Для получения дополнительной информации см. «Человек-мужчина».

+0

Ух, не видел эту опцию, thx ^^ – Trollhorn

+1

Это прекрасно работает, пока нет никого, что «человек» не знает о том, что вам нужно, чтобы он выглядел. Затем вы начинаете играть с MANPATH. –

0

Учитывая Bourne оболочки, я бы, вероятно, использовать:

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, что достаточно маловероятно, что я бы не беспокоиться о Это.

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 
1

вы можете использовать поиск

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" \) 
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]$' 
Смежные вопросы