我想知道是否可以使用别名命令传递参数。
例如:
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
答案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 command
bash
{
;
在您的具体示例中,我们可以这样做:
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
当然,这不是一种广泛使用的方法,因为在现实世界中我们必须处理复杂的参数,所以这种方法不太实用。函数要灵活得多。而且引用参数字符串的需求很快就会变得烦人。
尽管存在限制,但它可以使用简单的字符串作为参数,我们可以进行分词,从而部分允许我们为别名提供参数。