对于bash脚本,我可以使用"$@"访问参数。当我使用别名时等效吗?

#1 楼

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

如果您想对参数的解释方式进行实际控制,则可以编写像这样的功能:

my_program_wrapper() {
    local first_arg="" \
          second_arg=""

    shift 2               # get rid of the first two arguments

    # ...

    /path/to/my_program "$@"
}


评论


opengroup.org/onlinepubs/009695399/utilities/…sh中的函数已定义my_program_wrapper(){...; }。 Bash可以处理关键字功能,但是为什么不随身携带更便携的功能呢?

–短暂
2010年11月5日,下午1:51

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

–amphetamachine
2010-11-5 12:53

#2 楼

别名解决方案

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

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


如果您只需要第一个参数。

说明

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

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

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

评论


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

–椭圆视图
17年12月15日在19:45



我有别名。一旦我别名是否正常。旧名称冲突的东西。

–椭圆视图
17年12月19日在3:51

命令类型f :)

–汤姆·黑尔
18年6月25日在16:56

大!那是最懒的变体!

– Sergius
19年4月10日在17:13

这对于特殊情况非常有用。考虑一个代码块,您希望在此代码上避免大惊小怪:echo echo ='f(){echo“ $ @”&> / dev / null;未设置-f f; }; F'。例如,将该行添加到引导脚本以强制进入安静模式。

–Beejor
19年5月2日在20:03

#3 楼

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

lsswp / tmp /

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

出于各种目的,应该在中间的某个位置使用参数,则需要使用ls -l /tmp/ | grep swp而不是function

#4 楼

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

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


您将看到foo.txt的首页,而less将在EOF(-e)退出,搜索将不区分大小写(-i)等

评论


您能否看一下我的问题-没有一种解决方案对我有效,因此我无法开始赏金。

– JJD
16-2-9在23:40



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

–沃伦·杨(Warren Young)
16年2月9日在23:44

#5 楼

我在回答csh:

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

tar-gz的示例:

$ 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