2

Bash は「一種の関数型プログラミング言語」であり、クラスはありません。Closuresでカプセル化を使用することができましたが、親/スーパー/ベース関数も見つけるためにイントロスペクションを行いたいと思いdocker_ます(これを正しく定義するためにコメントを追加することがわかっている場合)。

私はこれを管理しましたが、汚いハックsuper=${FUNCNAME}でした。種類を使用する解決策はありますPARENT_FUNCNAMEか? 私はそのようなファイルdocker_.shを持っています:

#!/usr/bin/env bash
function docker_ {
    local super=${FUNCNAME}
    function hello {
        echo "INFO" "do ${super}${FUNCNAME}"
    }
    function install {
        echo "INFO" "do ${super}${FUNCNAME}"
        #sudo curl -sSL https://get.docker.com/ | sh || exit 1
    }
    function run {
        echo "INFO" "do ${super}${FUNCNAME}"
        #docker run -d -p 3306:3306 ${DOCKER_IMAGE_NAME} /docker.sh run_mysql
    }
    ${@}
}
${@}

いくつかの結果を得ました:

$ ./docker_.sh docker_ hello
INFO do docker_hello

$ ./docker_.sh docker_ run
INFO do docker_run

$ ./docker_.sh docker_ install
INFO do docker_install

解決済み

使用する

${FUNCNAME[1]}
${FUNCNAME[@]:0:${#FUNCNAME[@]}-1} get all list beside main

コード:

#!/usr/bin/env bash
function docker_ {
    function hello {
        echo "INFO" "do ${FUNCNAME[1]} ${FUNCNAME}"
    }
    function install {
        echo "INFO" "do > ${FUNCNAME[@]:0:${#FUNCNAME[@]}-1} "
        #sudo curl -sSL https://get.docker.com/ | sh || exit 1
    }
    function run {
        echo "INFO" "do > ${FUNCNAME[@]:0:${#FUNCNAME[@]}-1} "
        #docker run -d -p 3306:3306 ${DOCKER_IMAGE_NAME} /docker.sh run_mysql
    }
    ${@}
}
${@}

いくつかの結果を得ました:

    ➜ ./docker_.sh docker_ hello  
    INFO do docker_ hello
    ➜ ./docker_.sh docker_ install
    INFO do > install docker_ 
    ➜ ./docker_.sh docker_ run    
    INFO do > run docker_ 
4

1 に答える 1

3

Bash は実際には関数型プログラミング言語ではありません。まず第一に、関数は第一級のオブジェクトではありません。関数を渡すことはできません。関数の名前を渡すことができますが、それは単なる名前です。名前に新しい値を指定すると、古い値は失われます。

Bash にはレキシカル スコープがありません。bash スコープは動的です。localコマンドは、他のコマンドと同様にコマンドです。構文ではありません。実行されない場合、名前はローカルになりません。例えば:

f() {
  if [[ $1 == local ]]; then local myvar=local; fi
  myvar=changed
}

$ var=original
$ f local
$ echo $myvar
original
$ f global
$ echo $myvar
changed

また、bash にはクロージャがありません。関数内で関数を定義できますが、そのように定義された関数にはスコープがありません。

$ g() {
>   local myvar=inner
>    f() { echo $myvar; }
>    f
> }
$ myvar=outer
$ g
inner
$ f
outer
$ h() { local myvar=inside_h; f; }
$ h
inside_h
$ f
outer
于 2015-10-10T04:33:01.503 に答える