Bash (Git) - 函数、别名和 SH 脚本文件

Bash (Git) - 函数、别名和 SH 脚本文件

我已经非常熟练地使用别名,特别是使用所有不同的 git 命令及其顺序和相互依赖关系等。因此,我创建了一些运行更复杂脚本的别名。

alias stash='f() { .... }; f'

总的来说非常直接。然而,作为我最纯粹的开发风格,我喜欢“格式良好”的代码。形式有时与功能一样重要。因此,使用一个简单的别名:

alias gca='git commit --amend '

我可以毫无问题地将它们直接列在.bash_aliases文件中。但对于某些多命令别名,我希望它们是分开的。

打字help我看到

function name { COMMANDS ; } or name () { COMMANDS ; }

但我目前理解使用的唯一方法function是以别名的形式。但考虑到我评论的帖子的颜色git diff --name-status,我可以将脚本合并到 SH 文件中,对于该示例,我通过 xargs 将数据传递到其中。

但是是否有可能(可能)通过脚本创建“函数”,因此它们不是被列为“别名”,而是被列为存储在 sh 文件中的实际函数?

假想:

alias stash='f() { if [[ -z $1 ]]; then git stash list; else git stash $1; fi; }; f'

相反,一个stash.sh文件将具有:

function stash
{
  if [[ -z $1 ]]; then
     stash list;
  else git stash $1;
  fi;
}

类似的事情是可能的,所以在这两种情况下,我都会在提示符下简单地输入“stash”,但它们的定义方式却截然不同?

答案1

您可以在您的环境中获取所需功能的列表。

创建一个文件~/.bash_functions并从 获取它~./bashrc。与来源
相同的方式:./bash_aliases

if [ -f ~/.bash_functions ]; then
    . ~/.bash_functions
fi

然后,定义您想要的任意数量(和复杂程度)的函数。
您可以为函数定义别名(在 ~/.bash_aliases 中以保持秩序)。但这并不是真正需要的,因为您可以直接调用源函数。通过定义:

stash() {
    if [[ -z $1 ]]; then
        stash list;
    else
        git stash $1;
    fi;
}

您可以简单地通过stash或来调用它stash this,不需要别名。

答案2

我很困惑为什么你要把函数定义填充到别名中。您的stash别名定义一个函数调用f,然后立即调用它,以接收传递给别名的参数。对于日常使用,这相当于定义一个名为的函数stash

function stash {
  if (($# == 0)); then
     git stash list;
  else
     git stash "$@";
  fi;
}

与别名中的内容相比:

  • 您可以使用function stash { … }stash () { … }来定义函数。它们是等效的,只是如果您已经定义了一个名为 的别名stash,那么它会在您尝试定义函数时扩展,因此定义最终不会执行您想要的操作。定义函数时,请确保函数名称尚未定义为别名,或者使用语法function
  • 我用来(($#==0))测试函数是否有任何参数,而不是测试第一个参数是否为空。意图更加明确。 (这允许一个空参数,但这在这里没有意义。)
  • 始终在变量扩展周围使用双引号
  • 我在调用 git 时使用"$@"而不是。传递函数的所有参数。"$1""$@"

您可以将函数定义放在与别名定义相同的位置:在您的.bashrc、 in.bash_aliases或由 来源的另一个文件中.bashrc,例如

. ~/lib/git-functions.bash

答案3

{   cat >myfunction.fn
    .  ./myfunction.fn
    fn  1 2 3 4 5
} <<""
    fn(){
        printf %s\\n "$@"
    }

1
2
3
4
5

shell 的.命令将来源当前 shell 执行环境中的命名文件。其中定义的任何函数、变量、别名或其他类型的 shell 状态在return发生时都将持续存在。

你可以做一个自动加载函数定义的排序,例如,通过定义存根函数:

fn(){ . ./fn.file && fn "$@"; }

...其中源文件包含以下内容的重新定义fn()

fn(){
   : a whole new fn
}
: any other init state commands you might like to run

相关内容