.bashrc 末尾的 'source' 语句和 'function' 声明相互干扰

'source' statement and 'function' declaration at end of .bashrc interfere with one another

起初我创建了一个脚本来 'find' 一个文件并切换到那个目录。 las,从脚本返回后,'cd' 没有改变。脚本中的目录更改是该脚本的本地更改。我忘了。告我。

所以...我在 .bashrc 中创建了与函数相同的代码。当我重新输入 Bash shell 时,该函数未定义或可见。所以……我把这个函数放在 .bashrc 的末尾——瞧! - 有效。这是函数:

function goto {

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

问题来了。我必须在 .bashrc 中 SDKMan 的初始化代码后移动它(忽略 #THIS 必须在文件末尾才能使 SDKMAN 工作!!!).毫不奇怪,'sdk' 不再有效。

是否有 "right way" 在 .bashrc 中包含一个函数,以便像 SDKMan 之类的其他脚本可以保留在最后,不管出于什么神明的原因,它必须在那里......?? ?

我先卸载然后重新安装 SDKMan,这些功能现在可以像 SDKMan 一样工作了。

他们添加的条件很奇怪。它让我想起了 Perl 中的快捷方式。

这是添加到 .bashrc 的代码:

#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

但我猜它长了几个字符。如果他们使用了他们刚刚在其上方定义的 var,它会更短:

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

巴尔马尔:你是对的。 .bashrc 中的位置无关紧要。谢谢。 Wiimm:谢谢你的提示。 马克:为了更好的衡量,我已经导出了函数。谢谢