微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Bash仅在特定目录中时才能访问子文件夹中的脚本

如何解决Bash仅在特定目录中时才能访问子文件夹中的脚本

要详细说明,

项目结构

current-working-directory
  -- scripts [d]
    -- script1 [d]
      -- script1 [f]
    -- script2 [d]
      -- script2 [f]
  -- README [f]
  -- executable [f]

主要思想:我希望能够运行位于 script1 中的 function1 我在 current-working-directory 或任何子文件夹中。

在这方面有多次尝试:

IDEA#1 .bashrc

function cd {
    builtin cd $@
    local dir
    if [ -d "bpm_modules" ]; then
      for dir in $(ls bpm_modules);do
        . "$PWD/bpm_modules/$dir/$dir"
      done
    fi
  }

用cd命令包装

注意:由于我是文件的来源,一旦离开目录,我仍然可以访问。


IDEA#2 .bashrc

function require {
    # You Have Gone Too Far
    [ "$1" == "$HOME" ] && return 1
    
    # Assign Parameters Accordingly
    [ $# -eq 1 ] && local CWD="$PWD" && local QUERY="$1"
    [ $# -eq 2 ] && local CWD="$1" && local QUERY="$2"
    local FOUND_MODULE=1

    # Error Handling
    function trapper {
        local BOO=$1
        local QUERY=$2
        NOT_FOUND="$(tput setaf 1)[DEPENDENCY]: $(tput sgr0)missing '$QUERY'"
        
        [[ $BOO -eq 1 ]] && echo "$NOT_FOUND"
    }
    
    # If In BCS Initialized Project
    if [ -d "$CWD/.bpm" ]; then
        
        # Check For Module
        for DIR in $( ls $CWD/bpm_modules); do
            [ "$DIR" == "$QUERY" ] && FOUND_MODULE=0 && source $CWD/bpm_modules/$DIR/$DIR
        done
        trap "trapper $FOUND_MODULE $QUERY" $?
    # Else Go Up A Directory Recursively
    else
        CWD_UP1=$(cd $CWD && cd .. && pwd)
        require $CWD_UP1 $QUERY
    fi

}

require将用在上面项目目录图中的executable之内,然后是类似require script1这样的脚本/文件名称,以获取文件并允许我在{ {1}}


Repo @ Github

Package-Library

PS:我有2个星期的bash体验,所以...,我很欣赏任何要求或苛刻的事实。

PS1:“ bash pun amirite ”,它用于当前正在工作的 bash-package-manager

解决方法

假设我正在运行一个名为my_script.sh的脚本。如果我想实现您的require函数,那么如果该脚本位于目录$my_dir中,它将获取参数中给出的脚本,否则崩溃,您可以执行以下操作:

#!/bin/sh

require() {
    if realpath --relative-to="$my_dir" "$1" | fgrep ../; then
        echo Script "$1" is not located in directory "$my_dir",exiting. >&2
        exit 1
    fi
    source $1
}

请注意,如果realpath返回的路径中的目录以..结尾,则此操作将失败。我认为这是一个合理的限制,但请注意,要解决此问题,可以将fgrep ../替换为grep '\(^\.\./\)\|/\.\./'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。