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

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

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

例如:

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

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

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

答案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

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

答案2

您需要有一个函数来实现这一点,如所以这里。请尝试以下操作:

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

并使用以下foo方式调用:

foo arg1 arg2 arg3

答案3

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

别名不能接受参数,但我们可以“模拟”这一点。以我在这个问题

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

这里发生的关键点:

  • 我们使用read内置函数将字符串读入变量d。因为我们想要读取包含空白字符(换行符、制表符、空格)的完整字符串,所以我们使用IFS=并禁用反斜杠转义-r
  • <<<此处字符串运算符允许我们将任何作为参数提供的字符串重定向到mkcd别名;用法如下mkcd "some directory"
  • 别名中的多个命令使用结构(手册中{ list; }称为)组合并在当前 shell 中执行。请注意,后面需要有前导空格,并且需要单独的命令列表。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

当然,这不是一种广泛使用的方法,因为在现实世界中我们必须处理复杂的参数,所以这种方法不太实用。函数要灵活得多。而且引用参数字符串的需求很快就会变得烦人。

尽管存在限制,但它可以使用简单的字符串作为参数,我们可以进行分词,从而部分允许我们为别名提供参数。

答案4

在这种特殊情况下,参数位于末尾,您不需要函数,只需要:

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

然后运行例如,d 2您将只得到两行。缺点是没有默认值。要在其中插入参数,我将遵循这个答案

顺便说一句,您可以使用journalctl参数喜欢--dmesg-k -p err, ETC。

相关内容