【问题标题】:'source' statement and 'function' declaration at end of .bashrc interfere with one another.bashrc 末尾的“源”语句和“函数”声明相互干扰
【发布时间】:2020-04-16 04:04:55
【问题描述】:

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

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

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
}

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

有没有一种“正确的方法”在 .bashrc 中包含一个函数,这样 SDKMan 等其他脚本就可以保留在最后,不管出于什么原因,它必须在那里......???

【问题讨论】:

  • 将函数定义放在该注释之前。
  • 我试过了。 'goto' 函数的存在似乎导致 .bashrc 跳过 SDKMan 初始化命令。 'goto' 功能(是的,我对这个名字感到遗憾)有效,但找不到 'sdk' 命令。
  • set -x放在开头,这样你就可以看到正在执行的命令。
  • 函数定义不应该对脚本的其余部分产生任何影响。您确定没有对脚本进行其他更改吗?
  • sdk 的东西需要放在最后的唯一原因是更新包时可以找到它来替换它。该位置对于正常运作应该无关紧要。

标签: bash function sdkman


【解决方案1】:

我卸载了然后重新安装了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

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

【讨论】: