Почему 'manpath' работает, а 'echo $ MANPATH' - нет?

(в Bash) Можно заменить на массив значений:

find2() {

    ARGS="/usr/bin/find"
    ARGS+=( "$@" )
    echo CALLING:  "${ARGS[@]}"
    "${ARGS[@]}"

}

find2 /tmp/test -name "hello.c"

Но это работает и гораздо проще:

find2() {
    ARGS=( "/usr/bin/find" "$@" )
    echo CALLING:  "${ARGS[@]}"
    "${ARGS[@]}"
}

find2 /tmp/test -name "hello.c"

Конечно, прямой способ тоже работает (в любой оболочке с функциями):

find2() {    /usr/bin/find "$@";   }

find2 /tmp/test -name "hello.c"

Почему оригинальный код не удался?

Чтобы "увидеть", что делает код, можно использовать set -x или, еще лучше, заменить echo на printf, вот так:

find2() {

    ARGS="/usr/bin/find"
    ARGS+=( "$@" )
    printf '<%s> ' CALLING:  "${ARGS[@]}"; echo
    "${ARGS[@]}"

}

find2 /tmp/test -name "hello.c"

Выполнив его, вы увидите:

$ ./script.sh
<CALLING:> </usr/bin/find> </tmp/test> <-name> <hello.c> 

Каждый аргумент - отдельный элемент (обратите внимание на положение <>).

Однако в исходном коде (добавив printf):

function find2 {

    ARGS="/usr/bin/find"
    while [[ $# -gt 0 ]]; do
        ARGS="$ARGS '$1'"
        shift
    done
    printf '<%s> ' CALLING:  "${ARGS[@]}"; echo
    $ARGS

}   

find2 /tmp/test -name "hello.c"

При выполнении вы получите:

$ ./script.sh
<CALLING:> </usr/bin/find '/tmp/test' '-name' 'hello.c'>

Все значения представляют собой длинную текстовую строку, а не отдельные аргументы (обратите внимание на позицию <>).

4
13.01.2017, 12:21
2 ответа

Причина, по которой все дело в существовании переменной $ MANPATH : Для перезаписи, если требуется настраиваемый путь к руководству.

Цитирование страниц руководства Debian Lenny:

ОПИСАНИЕ

Если задано $ MANPATH , manpath просто отобразит его содержимое и выдаст предупреждение. В противном случае manpath определит подходящий путь поиска иерархии страниц руководства и отобразит результаты.

Разделенный двоеточиями путь определяется с использованием информации, полученной из файла конфигурации man-db - ( /etc/manpath.config ) и среды пользователя .

Когда на странице руководства говорится: «Если $ MANPATH установлен», это означает «если эта переменная установлена ​​пользователем или скриптом ...» или «если эта переменная пуста, используйте значения по умолчанию находятся в manpath.config ".

Найдите время и пролистайте файл /etc/manpath.config , чтобы узнать, как структурированы все пути к страницам руководства.

Связанные материалы:

Некоторые ссылки о манипулировании $ MANPATH или создании пользовательского пути к страницам руководства.

1
27.01.2020, 20:50

Из моего man manpath (Ubuntu 16. 10 - поскольку вы не упомянули детали вашей системы):

Если $MANPATH установлен, manpath отображает его значение, а не определяет его а не определяет его на лету.

Таким образом, $MANPATH - это скорее переопределение конфигурации по умолчанию, заданной в /etc/manpath.config.

Примечание также:

ОПИСАНИЕ

Если $MANPATH установлен, manpath просто отобразит его содержимое и выдаст предупреждение. Если нет, manpath определит подходящий путь поиска иерархии страниц руководства и отобразит результаты.

6
27.01.2020, 20:50

Теги

Похожие вопросы