我可以将参数传递给别名命令吗?

我想知道我是否可以使用别名命令传递参数。

例如:

alias d="dmesg|grep -iw usb|tail -5" 

现在d将打印最后5行。 如果我想使用d打印不同数量的行,我必须再次在d的别名命令声明中进行更改。

有什么办法可以修改别名的声明,这样我就不必重新输入声明来改变行数。 比如在声明d别名时将行数作为参数合并? 还是有其他方法可以解决这个问题?

别名不接受论证。 使用alias foo='bar $1'类的alias foo='bar $1' ,当别名运行时, $1将被shell扩展为shell的第一个参数(可能没什么)。

所以:改为使用函数

 d () { num=${1:-5} dmesg |grep -iw usb|tail -$num } 

num=${1:-5}使用第一个参数,如果未提供,则默认值为5。

然后你可以这样做:

 $ d # prints 5 lines $ d 10 # prints 10 lines 

或者,如果您更改了稍微使用的选项:

 alias d="dmesg|grep -iw usb|tail -n 5" 

然后你可以传递额外的-n选项:

 $ d # prints 5 lines $ d -n 10 # prints 10 lines 

如果为tail指定了多个-n选项,则仅使用last。

您需要具有此function,如SO和此处所述 。 请尝试以下方法:

 foo() { /path/to/command "$@" ;} 

并用以下方法调用foo

 foo arg1 arg2 arg3 

使用group命令和here-string解决别名限制

别名不能带参数,但我们可以“模拟”那个。 以我在这个问题上的答案为例。

 alias mkcd='{ IFS= read -rd && mkdir "$d" && cd "$d"; } <<<' 

这里发生的要点:

  • 我们使用read内置将字符串读入变量d 。 因为我们想要读取包含空白字符(换行符,制表符,空格)的完整字符串,所以我们使用IFS=并使用-r禁用反斜杠转义。
  • <<<这是字符串运算符允许我们将我们提供的任何字符串重定向为mkcd别名的参数; 用法将是mkcd "some directory"
  • 别名中的多个命令使用{ list; }组合并在当前shell中执行 { list; } structure(在bash手册中称为group command )。 注意{;之后的领先空间 需要单独的命令列表。

在您的具体示例中,我们可以:

 alias d='{ IFS= read -rn; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<' 

我们还可以使用单词拆分来存储以空格分隔的参数:

 bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";} <<< "arg1 arg2" arg1 arg2 

或者我们可以使用数组来提供多个参数:

 bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";} <<< "arg1 arg2" arg2 arg1 

但这是好方法吗?

不必要。 这种方法的问题在于它非常具体 - 参数不能轻易引用,这意味着我们只能有没有空格的参数。

 bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";} <<< "'arg1 with space' arg2" 'arg1 with space' arg2 

这当然不是广泛使用的东西,仅仅因为在现实世界中我们必须处理复杂的论证,所以这种方法不太实用。 function更灵活。 引用args字符串的需要变得很烦人。

尽管有这些限制,但这可以使用简单的字符串作为参数,我们可以提供单词拆分,因此部分允许我们为别名提供参数。