我曾经使用CShell(csh),它允许您创建一个接受参数的别名。符号有点像
alias junk="mv \\!* ~/.Trash"
在巴什,这似乎行不通。鉴于Bash有许多有用的特性,我会假设这一特性已经实现,但我想知道如何实现。
我曾经使用CShell(csh),它允许您创建一个接受参数的别名。符号有点像
alias junk="mv \\!* ~/.Trash"
在巴什,这似乎行不通。鉴于Bash有许多有用的特性,我会假设这一特性已经实现,但我想知道如何实现。
当前回答
您所要做的就是在别名中生成一个函数:
$ alias mkcd='_mkcd(){ mkdir "$1"; cd "$1";}; _mkcd'
^ * ^ ^ ^ ^ ^
您必须在“$1”周围加双引号,因为单引号不起作用。这是因为在标有箭头的地方出现引号冲突会混淆系统。此外,在标有星号的位置需要一个空间用于该功能。
其他回答
要获取参数,应该使用函数!
然而,$@在创建别名时得到解释,而不是在执行别名期间得到解释,并且转义$也不起作用。我如何解决这个问题?
您需要使用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; }
这个问题被问错了。您不会创建一个接受参数的别名,因为别名只是为已经存在的对象添加第二个名称。OP想要的功能是创建新功能的功能命令。您不需要对函数进行别名,因为函数已经具有名称。
我想你想要这样的东西:
function trash() { mv "$@" ~/.Trash; }
就是这样!您可以使用参数$1、$2、$3等,或者只使用$@
要具体回答有关创建别名以将文件移动到垃圾箱文件夹而不是删除文件的问题,请执行以下操作:
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一二三。
我喜欢这个基于$@的解决方案,因为它可以处理任意数量的参数。
这是另一种使用read的方法。我使用这个方法通过名称片段对文件进行暴力搜索,忽略了“拒绝权限”消息。
alias loc0='( IFS= read -r x; find . -iname "*" -print 2>/dev/null | grep $x;) <<<'
一个简单的例子:
$ ( IFS= read -r x; echo "1 $x 2 ";) <<< "a b"
1 a b 2
注意,这将参数作为字符串转换为变量。可以在引号中使用多个参数,以空格分隔:
$ ( read -r x0 x1; echo "1 ${x0} 2 ${x1} 3 ";) <<< "a b"
1 a 2 b 3