簡體   English   中英

.bashrc 末尾的 'source' 語句和 'function' 聲明相互干擾

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

起初,我創建了一個腳本來“查找”一個文件並切換到該目錄。 唉,從腳本返回后,“cd”沒有改變。 腳本中的目錄更改是該腳本的本地更改。 我忘了。 告我。

所以...我在 .bashrc 的中間創建了與 function 相同的代碼。 當我重新輸入 Bash shell 時,function 未定義或可見。 所以...我將 function 放在 .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
}

現在問題來了。 我不得不在 SDKMan 的 init 代碼 in.bashrc之后移動它(忽略#THIS 必須在 SDKMAN 工作的文件末尾的警告!!! )。 毫不奇怪,“sdk”不再有效。

是否有“正確的方法”在.bashrc 中包含 function 以便其他腳本(如 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 中的位置無關緊要。 謝謝。 威姆:謝謝你的提示。 馬克:為了更好的衡量,我已經導出了函數。 謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM