如何将参数传递给别名?


64

对于bash脚本,我可以使用"$@"访问参数。当我使用别名是什么意思?

Answers:


50

别名就像命令一样,它们的所有参数都作为参数传递给别名的程序。例如,如果您要别名lsls -la,则键入ls foo bar真正ls -la foo bar在命令行上执行。

如果要实际控制参数的解释方式,则可以编写如下函数:

my_program_wrapper() {
    local first_arg="$1" \
          second_arg="$2"

    shift 2               # get rid of the first two arguments

    # ...

    /path/to/my_program "$@"
}

3
opengroup.org/onlinepubs/009695399/utilities/…中的功能sh已定义my_program_wrapper() { ...; }。Bash可以处理关键字,function但是为什么不选择更便携的工具呢?
短暂

2
@ephemient非常正确。我的意思是除了每个人都使用GNU Bash而不是准系统POSIX shell的事实。
amphetamachine

21

别名解决方案

如果您真的反对使用函数本身,则可以使用:

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

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

说明

这将创建一个临时函数f,该函数将传递参数。

别名参数仅在最后传递。请注意,f该别名在别名的最末端被调用。

unset -f执行别名时,remove会删除函数定义,因此以后不会挂起。


哼? wrap_args x y z给我:bash:意外标记'('附近的语法错误
椭圆视图

@Elipticalview嗯,复制粘贴问题?确认正在使用bash 4.4.12。
汤姆·黑尔

1
我已经f别名了。一旦我没有混淆,f它就可以正常工作。旧名称冲突的东西。
椭圆视图

command type f:)
汤姆·黑尔

1
大!那是最懒惰的变体!
Sergius

19

除了当前的答案外,要了解别名的工作原理,重要的一点是,在别名命令之后键入的所有参数都将在字面上最后使用。因此,无法对两个命令(是否管道)使用别名,第一个命令应该从别名中解释参数。为了清楚起见,下面是一个无法正常工作的示例:

alias lsswp="ls -l | grep swp"

(一个例子的启发这个问题),这将始终使用的输出ls -l在所进行的当前目录,并做一个的grep -因此使用

lsswp / tmp /

等同于ls -l | grep swp /tmp/不是 ls -l /tmp/ | grep swp

出于各种目的,应在中间的某个位置使用参数,则需要使用a function代替alias


15

实际上,您无需执行任何操作。别名会自动执行此操作。例如:

$ alias less="less -eirqM"
$ less foo.txt

您将看到foo.txt的第一页,并less在EOF(-e)退出,搜索将不区分大小写(-i),依此类推。


您能否看一下我的问题 - 所有解决方案都不适合我,因此我不被允许悬赏。
JJD

1
@JJD回答您问题的人是正确的:在这种情况下,您需要一个函数,而不是别名。由于对该问题的公认答案本质上是相同的,因此您的问题已被正确解决。
沃伦·杨

1

我在回答csh:

是的,您可以在别名中使用参数,并且-与上面所说的不同-您可以在别名的定义中的任何地方引用它们-不仅可以在末尾引用。

tar-gz -ing的示例:

$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"

,其中!:1!:2是调用别名时将提供的参数。

使用示例:

    $ ls
    clrcf.dat                             user_comment_2016.06.03_12:51:50.txt  user_comment_2016.06.03_12:54:48.txt
        TEST-wADM.tec                         user_comment_2016.06.03_12:52:04.txt  user_comment_2016.06.03_12:55:13.txt


    $ tgz user* out
    a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K

    $ ls out*
    out.tar.gz

这实际上意味着您使用了在tar命令的任意位置插入的两个参数,使所有参数成为别名 tgz

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.