我可以将参数传递给别名命令吗?
我想知道我是否可以使用别名命令传递参数。
例如:
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字符串的需要变得很烦人。
尽管有这些限制,但这可以使用简单的字符串作为参数,我们可以提供单词拆分,因此部分允许我们为别名提供参数。