Bash:在另一个函数中定义动态函数

时间:2016-07-10 19:20:23

标签: bash shell vim

由于我的问题似乎有点负担,我只是解释我尝试做什么。 我经常使用监禁程序,例如bash,这使我进入另一个上下文。 (例如vim等文字编辑器或irbpython -i等shell。

在那里我经常闲聊一下,直到我用^Z让程序进入睡眠状态。那时,我回到了我的正常bash shell,母舰

在某些时候我可能想再次打电话给irbvim,但是因为我不知所措,我通常已经忘记了我正在睡觉的那个节目的实例。即使我没有,我的手通常比我的大脑更快地行动起来让我们看看那些jobpec!

现在,我在同一个shell实例中运行了同一程序的两个实例。现在goto 1:我会再次^Z,忘记它,运行另一个实例,等等。

所以当我打电话给vim

时,我想我会这样做
  • vim个实例超过1时,请将其混淆
  • 当已经有vim个实例打开时,打开那个
  • 当没有vim的实例打开时,打开一个新的
  • 当我真的想要两次打开同一个程序时,我可以使用vim!
  • 这样做

这是我的计划:

_make_escapable() {
    "$1"() {
        declare INSTANCES_OF_CMD=$(jobs | grep -c "\S\+Stopped\+\S\+\s\+$1")

        case ${INSTANCES_OF_CMD} in
            0)
                command "$1" "$@"
                ;;
            1)
                if [ $# -eq 0 ]; then
                    %"$1"
                    return 0
                else
                    echo "Can't open other files with a running instance of $1"'!' 1>&2
                fi
                ;;
            *)
                echo "You have multiple instances of $1 running. Choose one." 1>&2
                ;;
        esac
    }

    alias "$1"'!'="command $1"
}

_make_escapable 'vim'
_make_escapable 'irb'

如您所见,我想自动化该功能。问题是函数名称没有参数扩展(似乎)。我可以为每个程序执行一个新功能,但是我有一个很好的界面来执行此操作。 有人知道怎么做吗?

1 个答案:

答案 0 :(得分:0)

_make_escapable() {
    alias make_function="$1"'() { declare INSTANCES_OF_CMD=$(jobs | grep -c "\S\+\s\+\S\+\s\+'"$1"'") &&
        case ${INSTANCES_OF_CMD} in
            0) command '"$@"' "$@" ;;
            1) if [ $# -eq 0 ]; then %'"$1"'; return 0 ; else echo ''Cannot use parameters with running instance of '"$1"'''; fi ;;
            *) echo ''You have multiple instances of '"$1"' running. Choose one.'' 1>&2 ;;
        esac; }'
    eval make_function
    unalias make_function

    alias "$1"'!'='command '"$1"
}

_make_escapable 'vim'
_make_escapable 'irb'
_make_escapable 'ghci' '-v0'

这将接受任何命令并使其可以逃跑,就像我在我的问题中描述的那样。

它首先使用别名构造函数定义,然后执行别名,定义函数。