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

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

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


当前回答

要获取参数,应该使用函数!

然而,$@在创建别名时得到解释,而不是在执行别名期间得到解释,并且转义$也不起作用。我如何解决这个问题?

您需要使用shell函数而不是别名来解决此问题。您可以如下定义foo:

function foo() { /path/to/command "$@" ;}

OR

foo() { /path/to/command "$@" ;}

最后,使用以下语法调用foo():

foo arg1 arg2 argN

确保将foo()添加到~/.bash_profile或~/.zshrc文件中。

在你的情况下,这会奏效的

function trash() { mv $@ ~/.Trash; }

其他回答

TL;DR:改为这样做

与别名相比,使用函数在命令中间放置参数要容易得多,也更具可读性。

$ wrap_args() { echo "before $@ after"; }
$ wrap_args 1 2 3
before 1 2 3 after

如果你继续读下去,你会学到一些你不需要知道的关于shell参数处理的东西。知识是危险的。只要得到你想要的结果,在黑暗面永远控制你的命运之前。

澄清

bash别名确实接受参数,但仅在末尾:

$ alias speak=echo
$ speak hello world
hello world

通过别名将参数放在命令中间确实是可能的,但这会变得很难看。

孩子们,不要在家里尝试这个!

如果你喜欢规避限制,做别人说不可能做的事,下面是食谱。如果你的头发被磨烂了,你的脸上布满了科学家式的烟灰,不要怪我。

解决方法是将别名只在末尾接受的参数传递给包装器,包装器将在中间插入这些参数,然后执行命令。

解决方案1

如果您确实反对使用函数本身,可以使用:

$ alias wrap_args='f(){ echo before "$@" after;  unset -f f; }; f'
$ wrap_args x y z
before x y z after

如果只需要第一个参数,可以将$@替换为$1。

解释1

这将创建一个临时函数f,传递给参数(注意f是在最后调用的)。unset-f在执行别名时删除函数定义,这样以后它就不会再出现了。

解决方案2

您也可以使用子外壳:

$ alias wrap_args='sh -c '\''echo before "$@" after'\'' _'

解释2

别名生成如下命令:

sh -c 'echo before "$@" after' _

评论:

占位符_是必需的,但它可以是任何内容。它被设置为sh的$0,并且是必需的,以便用户给定的第一个参数不会被消耗。演示:sh-c'echo消费:“$0”打印:“$@”'酒后胡言乱语消费:酒精印刷:醉酒胡言乱语单引号内的单引号是必填的。下面是一个不使用双引号的示例:$sh-c“echo消耗:$0打印:$@”酒后胡言乱语消耗:-bash打印:在这里,交互式shell的$0和$@的值在传递给sh之前被替换为双引号echo“消耗:$0打印:$@”消耗:-bash打印:单引号确保这些变量不会被交互式shell解释,并按字面传递给sh-c。你可以使用双引号和\$@,但最好的做法是引用你的论点(因为它们可能包含空格),而“\$@\”看起来更难看,但可能会帮助你赢得一场混淆比赛,在这场比赛中,凌乱的头发是参赛的先决条件。

要具体回答有关创建别名以将文件移动到垃圾箱文件夹而不是删除文件的问题,请执行以下操作:

alias rm="mv "$1" -t ~/.Trash/"

当然,你必须先创建dir~/.Trash。

然后只需发出以下命令:

$rm <filename>
$rm <dirname>

如果您正在寻找一种通用方法来将所有参数应用于函数,而不仅仅是一个或两个或其他硬编码金额,您可以这样做:

#!/usr/bin/env bash

# you would want to `source` this file, maybe in your .bash_profile?
function runjar_fn(){
    java -jar myjar.jar "$@";
}

alias runjar=runjar_fn;

因此,在上面的示例中,我将运行runjar时的所有参数传递给别名。

例如,如果我在那里运行了jar-hi,它最终会在那里运行java-jarmyjar.jar hi。如果我运行jar一二三,它将运行java-jarmyjar.jar一二三。

我喜欢这个基于$@的解决方案,因为它可以处理任意数量的参数。

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

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

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

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

这个问题被问错了。您不会创建一个接受参数的别名,因为别名只是为已经存在的对象添加第二个名称。OP想要的功能是创建新功能的功能命令。您不需要对函数进行别名,因为函数已经具有名称。

我想你想要这样的东西:

function trash() { mv "$@" ~/.Trash; }

就是这样!您可以使用参数$1、$2、$3等,或者只使用$@