Bash 함수/별칭을 실행/소스 코드 혼합 스크립트로 변환합니다.

Bash를 통해 모든 Bash 함수/별명을 실행 가능한 파일과 원본 코드 스크립트를 혼합하여 변환합니다


...매개 변수와 stdin과 함께 작업합니다.
참고:
스위치와 파라미터를 더 잘 처리할 수 있도록 cronstat (함수 below 를 다시 재구성할 것입니다.금방 올 거야. 단지 언제 올지 확실하지 않아.
  • Introduction
  • Motivation

  • How it works
  • Description

  • Generic Example
  • To Execute
  • To Source With Completion

  • Better Example
  • Example When Sourced
  • Example When executed As Script
  • Methods For Organization
  • Conclusion
  • 소개하다.


    Linux의 Bash 환경에서 스크립트 작성/프로그래밍 초보자든 베테랑이든 Bash 함수와 별명을 듣고, 사용하고, 만들 수 있습니다.나는 이런 내용을 너무 많이 토론하지 않을 것이다. 왜냐하면 이 글은 이런 것들을 잘 아는 사람들을 대상으로 하는 기능 수준을 논술했기 때문이다.말은 그렇지만나는 이것이 초보자들에게 너무 이해하기 어렵다고 생각하지 않는다. 물론, 모두가 읽는 것을 환영한다.

    모티프


    함수와 별명을 사용할 수 있는 몇 가지 방법이 있다.하나는 코드를 포함하는 파일/스크립트를 가져와 호출된 파일에서 함수를 실행하는 것이고, 다른 하나는 코드를 사용하여 스크립트 파일을 실행하고 매개 변수를 스크립트에 전달하여 스크립트의 함수에 전달하는 것이다.
    여러 해 동안 나는 무수한 함수와 스크립트를 썼고, 오랜 시간 동안 나는 먼저 함수를 정상적인 상태로 유지할 것이다.bash 프로필을 설정하고 다른 기계로 계속 전송했지만 시간이 지나자 내 파일이 너무 커지기 시작해서 각각 다른 기계에 놓기 시작했다.bash_funcs/.bash 파일에 별명을 붙여서 조직성을 유지하는 주 프로필에 놓으십시오.
    이런 방법은 매우 좋지만, 함수와 별명은 스크립트와 명령줄 등 특정한 환경에서만 사용할 수 있고, Alt + F2, KDE Runner, AutoKey 등 환경에서만 사용할 수 없거나, 핫키로만 설정할 수 있다는 것을 금방 깨달았다. 그래서 나는 함수를 항상 스크립트 파일에 두어야 한다는 것을 깨달았다. 그러면 어디서든 접근할 수 있다는 것을 깨달았다.
    나는 곧 Bash 셸 환경에 대한 이해에 따라 이 방법을 만들었다.나는 다른 사람이 이런 방법을 사용했는지 모르겠지만, 나는 이전에 이런 방법을 본 적이 없으며, 이런 방법을 사용하는 사람들에게 응당한 경의를 표했다.

    작업 원리


    묘사


    스크립트에서 함수나 별명을 호출하려면 상기 함수(또는 별명)를 스크립트에 넣고 함수에 전달할 매개 변수를 사용하여 스크립트를 호출해야 합니다. 함수 아래의 같은 스크립트에서 파일이 원본 파일이면 bashcomplete 명령을 넣거나 스크립트에 전달할 매개 변수를 사용하여 함수를 실행할 수 있습니다.

    일반적인 예


    범용, 무의미한 스크립트 예제 파일fake_function.bash(또는 기타 파일):
    #/usr/bin/env bash
    
    function fake_function {
        if [[ $# -gt 0 ]]; then
            printf 'Argument: %s\n' "$@"
        else return 1; fi
    }
    
    # if file is sourced set Bash completion
    if $(return >/dev/null 2>&1); then
        complete -W "word1 word2 word3" fake_function
    else 
        # else if file is executed pass arguments to it
        fake_function "$@"
        # or || exit "$?" in some cases for errors
    fi
    

    실행


    그리고 어떤 방법으로든 스크립트 실행하기;예를 들면 다음과 같습니다.
     $ ./fake_function.bash "Line 1" "Line 2"
    Line 1
    Line 2
    

    완성


    또는 소스 코드를 스크립트 파일로 변환하여 완료합니다(script_file.
    ff_path="/path/to/fake_function.bash"
    
    if [[ -f "$ff_path" ]]; then # if the script exists
        . "$ff_path" # source the file and function
    fi
    
    fake_function "Line 1" "Line2" # call the function
    # and call the function any time from the
    # command line
    

    더 좋은 예

    *NOTE*: This has been refactored to remove redundancy.이것은 cronstat (cronstat.bash 라는 함수와 스크립트의 실제 예입니다. stat 명령의 패키지입니다. 디렉터리의 최신 (기본) 또는 가장 오래된 파일, 디렉터리, 또는 둘 (기본) 을 필터하는 데 사용됩니다.내가 했던 최신 프로젝트를 찾아야 하는데 프로젝트 이름을 잊어버리거나 낡고 불필요한 파일을 찾을 때 아주 적합합니다..
    #!/usr/bin/env bash
    
    function cronstat {
        local path_mode=1 time_mode=1 bare_mode=0 arg
        if [[ $# -gt 0 ]]; then
            for arg in "$@"; do
                if [[ "$arg" =~ ^-([hH]|-[hH][eE][lL][pP])$ ]]; then
                    cat<<EOF
    
     'cronstat' - 'stat' wrapper to find the oldest
     and newest file, directory, or both from an
     arrayed or line delimited list.
    
     @USAGE:
        cronstat <LIST> [OPTIONS...]
        <LIST> | cronstat [OPTIONS...]
    
     @LIST:
        Any arrayed list of files or directories
        or the output of the 'find' or 'ls'
        commands etc...
    
     @OPTIONS:
        -h,--help       This help screen.
        -b,--bare       Print the path only, no
                        extra information.
        -f,--file       Filter by files.
        -d,--directory  Filter by directories.
                        Defaults to any file or
                        directory.
        -o,--oldest     Get the oldest item.
                        Defaults to the newest.
     @EXAMPLES:
        cronstat \$(find -maxdepth 1)
        find -maxdepth 1 | cronstat
        IFS=\$(echo -en "\n\b") array=(\$(ls -A --color=auto))
        cronstat \${array[@]} --file
        printf '%s\n' "\${array[@]}" | cronstat -odb
    
     @EXITCODES:
        0               No errors.
        1               No array or list passed.
        2               No values in list.
    
    EOF
                    return
                fi
                if [[ "$arg" =~ ^-([bB]|-[bB][aA][rR][eE])$ ]]; then
                    bare_mode=1
                    shift
                fi
                if [[ "$arg" =~ ^-([fF]|-[fF][iI][lL][eE])$ ]]; then
                    path_mode=2
                    shift
                fi
                if [[ "$arg" =~ ^-([dD]|-[dD][iI][rR][eE][cC][tT][oO][rR][yY])$ ]]; then
                    path_mode=3
                    shift
                fi
                if [[ "$arg" =~ ^-([oO]|-[oO][lL][dD][eE][sS][tT])$ ]]; then
                    time_mode=2
                    shift
                fi
                if [[ "$arg" =~ ^-([oO][fF]|[fF][oO])$ ]]; then
                    time_mode=2
                    path_mode=2
                    shift
                fi
                if [[ "$arg" =~ ^-([oO][dD]|[dD][oO])$ ]]; then
                    time_mode=2
                    path_mode=3
                    shift
                fi
                if [[ "$arg" =~ ^-([oO][bB]|[bB][oO])$ ]]; then
                    bare_mode=1
                    time_mode=2
                    shift
                fi
    
                if [[ "$arg" =~ ^-([fF][bB]|[bB][fF])$ ]]; then
                    bare_mode=1
                    path_mode=2
                    shift
                fi
                if [[ "$arg" =~ ^-([dD][bB]|[bB][dD])$ ]]; then
                    bare_mode=1
                    path_mode=3
                    shift
                fi
    
                if [[ "$arg" =~ ^-([oO][fF][bB]|[oO][bB][fF]|\
                                [bB][oO][fF]|[bB][fF][oO]|\
                                [fF][oO][bB]|[fF][bB][oO])$ ]]; then
                    bare_mode=1
                    time_mode=2
                    path_mode=2
                    shift
                fi
                if [[ "$arg" =~ ^-([oO][dD][bB]|[oO][bB][dD]|\
                                [bB][oO][dD]|[bB][dD][oO]|\
                                [dD][oO][bB]|[dD][bB][oO])$ ]]; then
                    bare_mode=1
                    time_mode=2
                    path_mode=3
                    shift
                fi
            done
        fi
        local input array date iter index=0 value time_string="Newest" path_string="File Or Directory"
        declare -A array
        if [[ ! -t 0 ]]; then
            while read -r input; do
                case "$path_mode" in
                    1)  if  [[ -f "$input" ]] ||
                            [[ -d "$input" ]]; then
                            date=$(stat -c %Z "$input")
                            array[$date]="$input"
                        fi;;
                    2)  if [[ -f "$input" ]]; then
                            path_string="File"
                            date=$(stat -c %Z "$input")
                            array[$date]="$input"
                        fi;;
                    3)  if [[ -d "$input" ]]; then
                            path_string="Directory"
                            date=$(stat -c %Z "$input")
                            array[$date]="$input"
                        fi;;
                esac
            done
        else
            if [[ $# -gt 0 ]]; then
                for input in "$@"; do
                    case "$path_mode" in
                        1)  if  [[ -f "$input" ]] ||
                                [[ -d "$input" ]]; then
                                date=$(stat -c %Z "$input")
                                array[$date]="$input"
                            fi;;
                        2)  if [[ -f "$input" ]]; then
                                path_string="File"
                                date=$(stat -c %Z "$input")
                                array[$date]="$input"
                            fi;;
                        3)  if [[ -d "$input" ]]; then
                                path_string="Directory"
                                date=$(stat -c %Z "$input")
                                array[$date]="$input"
                            fi;;
                    esac
                done
            else return 1; fi
        fi
        if [[ ${#array[@]} -eq 0 ]]; then
             return 2
        fi
        for iter in "${!array[@]}"; do
            if [[ $index -eq 0 ]]; then
                index=$((index + 1))
                value=$iter
            fi
            case "$time_mode" in
                1)  if [[ $iter -gt $value ]]; then
                        value=$iter
                    fi;;
                2)  if [[ $iter -lt $value ]]; then
                        time_string="Oldest"
                        value=$iter
                    fi;;
            esac
        done
        value="${array[$value]}"
        if [[ $bare_mode -eq 0 ]]; then
            printf '\n%s %s:\n%s\n\nLast Changed:\n%s\n\n' \
                "$time_string" \
                "$path_string" \
                "$value" \
                "$(stat -c %z "$value")"
        else
            printf '%s\n' "$value"
        fi
    }
    if $(return >/dev/null 2>&1); then
        complete -W "-h --help -o --oldest -f --file -d --directory -b --bare -of -od -ob -fb -db -ofb -odb '\$(find -maxdepth 1)'" cronstat
    else cronstat "$@";fi
    
    
    위의 일반적인 예와 같이 매개 변수를 사용하여 이 파일을 실행하거나 소스 코드를 점 또는 스크립트 파일로 변환하고 앞서 언급한 프로그램이나 핫키 및 다음 예제를 사용할 수 있습니다.

    소스의 예


     $ printf '%s\n' * .* | cronstat --oldest
    
    Oldest File Or Directory:
    examples.desktop
    
    Last Changed:
    2020-03-21 11:43:36.356069642 -0500
    
    

    스크립트 실행 예제


     $ ls -A --color=auto | ~/.bash/profile/functions/cronstat.bash --oldest --directory
    
    Oldest Directory:
    .pki
    
    Last Changed:
    2020-03-23 08:09:05.447080464 -0500
    
    

    조직 방법


    스크립트 파일의 주요 문제는 최종적으로 많은 스크립트 파일을 얻을 수 있다는 것이다. 만약 스크립트 파일을 구성하지 않는다면 너무 무섭다. 나는 최종적으로 나의 모든 함수 (.bash) 파일을 함수 폴더와 별명에 넣고, 점 설정 파일이나func 파일에서 이렇게 가져오려고 한다.
    (.bash funcs 또는.bash profile 등에서)*NOTE*: This has been refactored to work with file names with '-'.
    # Load funcs
    function bash_func_src {
        local file
        for file in $(find "${HOME}/.bash/profile/functions/" -maxdepth 1 -type f -name "*.bash"); do
            . "$file"
        done
    }
    bash_func_src
    
    # and aliases
    function bash_alias_src {
        local file
        for file in $(find "${HOME}/.bash/profile/aliases/" -maxdepth 1 -type f -name "*.bash"); do
            . "$file"
        done
    }
    bash_alias_src
    

    결론


    이러한 방법은 본질적으로 모든 Bash 코드를 다양한 환경에서 이식하고 접근할 수 있으며, 이를 스크립트에 저장할 수 있습니다. 코드를 전송할 수 있을 뿐만 아니라, 사용 예시 (스크립트 자체로 말하자면) 를 전송할 수 있고, 외부 Bash 완성 코드를 저장하는 곳도 전송할 수 있으며, 모든 내용을 저장할 수 있습니다.
    핫키 (AutoKey), Alt + F2, KDE Runner 및 기타 매개 변수를 사용하여 스크립트를 호출할 수 있는 모든 스크립트에서 이러한 함수를 실행할 수 있습니다.
    나는 이것이 몇몇 사람들에게 도움이 될 수 있기를 바란다. 만약 당신이 비슷한 일을 하거나, 어떤 건의나 평론이 있다면, 나는 기꺼이 들을 것이다.

    좋은 웹페이지 즐겨찾기