我已经非常熟练地使用别名,特别是使用所有不同的 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