我曾经使用CShell(csh),它允许您创建一个接受参数的别名。符号有点像

alias junk="mv \\!* ~/.Trash"

在巴什,这似乎行不通。鉴于Bash有许多有用的特性,我会假设这一特性已经实现,但我想知道如何实现。


当前回答

函数和别名都可以使用其他函数和别名所示的参数。此外,我想指出几个其他方面:

1.函数在自己的作用域中运行,别名共享作用域

在需要隐藏或暴露某些内容的情况下,了解这种差异可能很有用。它还表明,函数是封装的更好选择。

function tfunc(){
    GlobalFromFunc="Global From Func" # Function set global variable by default
    local FromFunc="onetwothree from func" # Set a local variable

}

alias talias='local LocalFromAlias="Local from Alias";  GlobalFromAlias="Global From Alias" # Cant hide a variable with local here '
# Test variables set by tfunc
tfunc # call tfunc
echo $GlobalFromFunc # This is visible
echo $LocalFromFunc # This is not visible
# Test variables set by talias
# call talias
talias
echo $GlobalFromAlias # This is invisible
echo $LocalFromAlias # This variable is unset and unusable 

输出:

bash-3.2$     # Test variables set by tfunc
bash-3.2$     tfunc # call tfunc
bash-3.2$     echo $GlobalFromFunc # This is visible
Global From Func
bash-3.2$     echo $LocalFromFunc # This is not visible

bash-3.2$     # Test variables set by talias
bash-3.2$     # call talias
bash-3.2$     talias
bash: local: can only be used in a function
bash-3.2$     echo $GlobalFromAlias # This is invisible
Global From Alias
bash-3.2$ echo $LocalFromAlias # This variable is unset and unusable

2.包装脚本是更好的选择

在我身上发生过几次,当通过ssh登录或涉及切换用户名或多用户环境时,找不到别名或函数。源点文件有一些提示和技巧,或者这个有趣的别名:aliassd='sudo'让这个后续的别名aliasinstall='sd-apt-get-install'按预期工作(注意sd='udo'中的额外空间)。然而,在这种情况下,包装脚本比函数或别名更有效。包装器脚本的主要优点是它在预期路径(即/usr/loca/bin/)下是可见的/可执行的,其中作为函数/别名需要在其可用之前获取。例如,您将一个函数放在~/.bash_profile或~/.bahrc中用于bash,但稍后切换到另一个shell(即zsh),则该函数不再可见。因此,当您有疑问时,包装脚本始终是最可靠和可移植的解决方案。

其他回答

完善上面的答案,您可以获得与别名类似的单行语法,这对于shell或.bashrc文件中的特殊定义更为方便:

bash$ myfunction() { mv "$1" "$1.bak" && cp -i "$2" "$1"; }

bash$ myfunction original.conf my.conf

不要忘记右右括号前的分号。同样,对于实际问题:

csh% alias junk="mv \\!* ~/.Trash"

bash$ junk() { mv "$@" ~/.Trash/; }

Or:

bash$ junk() { for item in "$@" ; do echo "Trashing: $item" ; mv "$item" ~/.Trash/; done; }

以下是示例:

alias gcommit='function _f() { git add -A; git commit -m "$1"; } ; _f'

非常重要:

{后和{前有一个空格。有一个;依次在每个命令之后。如果您在最后一个命令后忘记了这一点,您将看到>提示符!参数用引号括起来,如“$1”

另一种解决方案是使用标记,这是我最近创建的一个工具,它允许您将命令模板“书签”,并轻松地将光标放置在命令占位符处:

我发现,大多数时候,我都在使用shell函数,所以我不必在命令行中一次又一次地编写常用命令。在这个用例中使用函数的问题是在我的命令词汇表中添加新的术语,并且必须记住实际命令中的函数参数。标记目标是消除这种心理负担。

Bash别名不直接接受参数。您必须创建一个函数。

alias不接受参数,但可以像别名一样调用函数。例如:

myfunction() {
    #do things with parameters like $1 such as
    mv "$1" "$1.bak"
    cp "$2" "$1"
}


myfunction old.conf new.conf #calls `myfunction`

顺便说一句,.bashrc和其他文件中定义的Bash函数可以作为shell中的命令使用。例如,您可以这样调用前面的函数

$ myfunction original.conf my.conf

正如其他人已经指出的,使用函数应被视为最佳实践。

然而,这里有另一种方法,利用xargs:

alias junk="xargs -I "{}" -- mv "{}" "~/.Trash" <<< "

注意,这会对流的重定向产生副作用。