如何将参数传递给别名?

如何将参数传递给别名?

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

答案1

别名解决方案

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

$ 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在执行别名时会删除函数定义,因此它不会在执行后徘徊。

答案2

别名就像命令一样,它们的所有参数都作为参数传递给它们别名的程序。例如:

alias ls='ls -l -a -t -r'
# This now executes 'ls -l -a -t -r foo bar'
ls 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

除了目前的答案之外,要认识到别名如何工作的重要一点是,您在别名命令后键入的所有参数都将在最后按字面意思使用。因此,无法对两个命令(无论是否通过管道)使用别名,而第一个命令应解释其中的参数。为了清楚起见,下面是一个无法按预期工作的示例:

alias lsswp="ls -l | grep swp"

(一个例子的灵感来自这个问题ls -l)这将始终使用在中执行的输出当前的目录并对其执行 grep - 所以使用

lsswp /tmp/

将相当于ls -l | grep swp /tmp/不是 ls -l /tmp/ | grep swp

对于应该在中间某处使用参数的所有目的,需要使用功能而不是别名。

答案4

我正在回答 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

相关内容