оператор 'source' и объявление 'function' в конце .bashr c мешают друг другу - PullRequest
0 голосов
/ 16 апреля 2020

Сначала я создал скрипт для «поиска» файла и переключения в этот каталог. Увы, после возвращения из сценария «cd» не изменился. Изменения каталога в скрипте являются локальными для этого скрипта. Я забыл Подай в суд на меня.

Итак ... Я создал этот код в качестве функции в середине .bashr c. Когда я снова вхожу в оболочку Bash, функция не определяется или не отображается. Итак ... Я поместил функцию в конце .bashr c и - вуаля! -- это сработало. Вот функция:

function goto {

    if [[ "$1" == "" ]]
    then
        echo "[ERROR] $0 requires a filename as input."
        echo "[INFO]  Usage: $0 <filename> finds file and changes to that directory."
    else
        echo "[INFO] Looking for file: $1"
        declare -x -a full_filepath=$(find . -name "$1")
        if [[ "${full_filepath[0]}" == "" ]]
        then
            echo "[ERROR] Unable to find requested file $1. Exiting..."
        else
            local filepath=${full_filepath[0]%/*}
            local filename=${full_filepath[0]##*/}
            echo "[INFO] Switching to $filepath to locate $filename..."
            cd $filepath
        fi
    fi
}

Теперь вот проблема. Мне пришлось переместить его после кода инициализации SDKMan в .bashr c (игнорируя предупреждение о том, что # ЭТО ДОЛЖНО БЫТЬ В КОНЦЕ ФАЙЛА, ЧТОБЫ РАБОТАЕТ SDKMAN !!! ) , Не удивительно, что 'sdk' больше не работает.

Есть ли "правильный способ" включить функцию в .bashr c, чтобы другие скрипты, такие как SDKMan, могли остаться в конце, для чего бы то ни было в причина имени бога это должно быть там ... ???

1 Ответ

0 голосов
/ 17 апреля 2020

Я удалил, затем переустановил SDKMan , и теперь функции работают как SDKMan.

Условие, которое они добавляют, является странным. Это напоминает мне о ярлыках в Perl.

Вот код, добавленный к .bashr c:

#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
export SDKMAN_DIR="/home/peter/.sdkman"
[[ -s "/home/peter/.sdkman/bin/sdkman-init.sh ]] && source "/home/peter/.sdkman/bin/sdkman-init.sh

Это работает так же хорошо:

if [[ -s "/home/peter/.sdkman/bin/sdkman-init-sh" ]]; then source "/home/peter/.sdkman/bin/sdkman-init-sh"; fi

но это на несколько символов длиннее, я Угадай. И если бы они использовали переменную, которую они только что определили над ней, она была бы еще короче:

if [[ -s "$SDKMAN_DIR/bin/sdkman-init-sh" ]]; then source "$SDKMAN_DIR/bin/sdkman-init-sh"; fi

Бармар: Вы были правы. Расположение в .bashr c не имеет значения. Спасибо. Wiimm: Спасибо за совет. Марк: Для удобства я экспортировал функции. Спасибо.

...