如何将参数传递给别名?

pro*_*eek 101 shell parameter alias

对于 bash 脚本,我可以"$@"用来访问参数。使用别名时的等价物是什么?

amp*_*ine 67

别名就像命令一样,它们的所有参数都作为参数传递给它们别名的程序。例如,如果您将别名设置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 "$@"
}
Run Code Online (Sandbox Code Playgroud)

  • http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_09_05 `sh` 中的函数定义为 `my_program_wrapper() { ...; }`。Bash 确实处理了关键字“function”,但为什么不使用更便携的东西呢? (4认同)

Tom*_*ale 67

别名解决方案

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

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

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

解释

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

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

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

  • 伟大的!这是最懒的变体! (2认同)
  • 这对于特殊情况非常有用。考虑一个代码块,您希望以最小的麻烦防止回声:`alias echo='f(){ echo "$@" &>/dev/null; 未设置 -ff; }; f'`。例如,将这一行添加到引导脚本以强制进入安静模式。 (2认同)
  • 这看起来像是一个无用的复杂化,但仍然具有别名的许多缺点,例如如果函数代码本身需要使用单引号字符串,则会出现引用地狱。只需按照通常的方式定义函数就不会遇到这个问题,并且 `wrap_args(){ echo before "$@" after; };` 启动时间会更短,_并且_ 不会与临时函数发生名称冲突...... (2认同)

roz*_*acz 23

添加到目前的答案中,要意识到别名如何工作的一件重要事情是,您在别名命令之后键入的所有参数都将在最后按字面意思使用。所以没有办法为两个命令(管道或非管道)使用别名,其中第一个应该解释参数。为了清楚起见,这里有一个无法按预期工作的示例:

alias lsswp="ls -l | grep swp"
Run Code Online (Sandbox Code Playgroud)

(受此问题启发的示例)这将始终使用ls -l当前目录中执行的输出并对其执行 grep - 所以使用

lsswp /tmp/

将等价于ls -l | grep swp /tmp/ ls -l /tmp/ | grep swp

对于应该在中间某处使用参数的所有目的,需要使用 afunction而不是alias


War*_*ung 17

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

$ alias less="less -eirqM"
$ less foo.txt
Run Code Online (Sandbox Code Playgroud)

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


ste*_*ica 6

我正在回答 csh:

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

tar-gz -ing 的示例:

$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"
Run Code Online (Sandbox Code Playgroud)

,其中!: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
Run Code Online (Sandbox Code Playgroud)

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