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


19

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

例如:

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

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

有什么方法可以修改别名的声明,这样我就不必重新输入声明来更改行数。就像在声明别名时合并传递行数作为参数一样d?还是有其他解决方法?


在(t)csh中,“ \!*”将参数引用为别名(反斜杠只是为了逃避通常表示“历史记录”的感叹号),您甚至可以引用单个参数,尽管我不记得如何。因此,也许是“ tail -n \!*”之类的东西(我不认为\!*会在紧前面带有减号的情况下起作用)。但是,不确定是否可以在(ba)sh中使用。
barrycarter

Answers:


20

别名不带参数。有了一个别名一样alias foo='bar $1',在$1将外壳到外壳的第一个参数是运行别名的时候(这是很可能没有)进行扩展。

所以:改用function

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

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


对于像我这样的功能受到挑战的人:)简要说明将功能放置在哪里...即~/.bashrcrc.local或在任何地方可能会有所帮助。
WinEunuuchs2Unix

@ WinEunuuchs2Unix,无论将别名放在何处。
muru

5

您需要具有SO此处描述的功能。请尝试以下操作:

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

并致电foo

foo arg1 arg2 arg3

4

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

别名不能接受参数,但是我们可以“模拟”。以我对此问题的答案为例。

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

这里发生的关键点:

  • 我们使用read内置将字符串读入变量d。因为我们想读取包含空白字符(换行符,制表符,空格)的完整字符串,所以我们使用IFS=和禁用反斜杠转义-r
  • <<<这是这里的字符串运算符,它使我们能够将作​​为参数提供的任何字符串重定向到mkcd别名;用法将是mkcd "some directory"
  • 别名中的多个命令在结构中被组合并在当前Shell中执行{ list; }group commandbash手册中称为“结构” )。请注意,命令后面{;命令列表的前导空格是必需的。

在您的特定示例中,我们可以执行以下操作:

alias d='{ IFS= read -r n; 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

当然,这并不是一种将被广泛使用的东西,仅仅是因为在现实世界中我们必须处理复杂的论点,所以这种方法不太实用。功能更加灵活。引用args字符串的需求变得非常烦人。

尽管有这些限制,但它仍然可以使用简单的字符串作为参数进行参数拆分,因此可以部分地为别名提供参数。

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.