0

起初,我创建了一个脚本来“查找”一个文件并切换到该目录。唉,从脚本返回后,“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)可以保留在最后,无论出于什么原因,它必须在那里......???

4

1 回答 1

0

我卸载然后重新安装了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 中的位置无关紧要。谢谢。威姆:谢谢你的提示。马克:为了更好的衡量,我已经导出了函数。谢谢。

于 2020-04-17T02:30:14.043 回答