在Bash脚本中停止无限递归

时间:2015-06-23 21:28:09

标签: bash

所以我陷入了这个经典陷阱。在尝试自学一些基本的bash脚本时,我决定我想这样做:

alias emacs=emacsFunction

emacsFunction() {
    if [ "$#" -eq 1 ]; then
        emacs $1 &
    fi
    emacs 
}

目标非常简单。当我在终端中键入emacs时,如果我提供了一个参数(例如emacs .bashrc),我希望它在emacs中打开我的.bashrc文件,并且仍允许我在终端窗口中输入命令(将'&'添加到一个命令允许这个。)。

我愿意接受任何建议。我确信有一种比我这里的代码更有效(更智能)的方法。

提前致谢!

2 个答案:

答案 0 :(得分:4)

避免功能/别名/等。是command内置的内容(参见Bash Builtin Commands)。因此,当您想要避免使用函数或别名时,请使用command emacs

据说你不需要函数这里的别名。您的功能可以称为emacs。

你也不需要明确地测试参数,除非你只是希望它在传递参数时转到后台(否则不要)。 (我假设在后台的情况下会生成一个X窗口?)

如果您确实需要仅用于参数的背景版本,那么您需要这样:

emacs() {
    if [ $# -eq 0 ]; then
        command emacs
    else
        command emacs "$@" &
    fi
}

假设您不需要仅供参考的业务,那么您可以使用:

emacs() {
    command emacs "$@" &
}

如果您不想要仅用于参数的背景行为,那么就说这不是真的有任何不同,那么只需要始终运行emacs &emacs <files> &只保存最后输入&

答案 1 :(得分:1)

切换到if..else会有所帮助:

alias emacs=emacsFunction

function emacsFunction () {
    if [ "$#" -eq 1 ]; then
        emacs $1 &
    else
        emacs
    fi
}