使用group命令和here-string解决别名限制
别名不能接受参数,但是我们可以“模拟”。以我对此问题的答案为例。
alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'
这里发生的关键点:
- 我们使用
read
内置将字符串读入变量d
。因为我们想读取包含空白字符(换行符,制表符,空格)的完整字符串,所以我们使用IFS=
和禁用反斜杠转义-r
。
<<<
这是这里的字符串运算符,它使我们能够将作为参数提供的任何字符串重定向到mkcd
别名;用法将是mkcd "some directory"
- 别名中的多个命令在结构中被组合并在当前Shell中执行
{ list; }
(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
当然,这并不是一种将被广泛使用的东西,仅仅是因为在现实世界中我们必须处理复杂的论点,所以这种方法不太实用。功能更加灵活。引用args字符串的需求变得非常烦人。
尽管有这些限制,但它仍然可以使用简单的字符串作为参数进行参数拆分,因此可以部分地为别名提供参数。