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

srk*_*_cb 30 command-line bash alias

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

例如:

alias d="dmesg|grep -iw usb|tail -5" 
Run Code Online (Sandbox Code Playgroud)

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

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

mur*_*uru 35

别名不接受参数。使用像 一样的别名alias foo='bar $1'$1当别名运行时,shell 将把 扩展为shell 的第一个参数(可能什么都没有)。

所以:改用函数

d () {
  num=${1:-5}
  dmesg |grep -iw usb|tail -$num
}
Run Code Online (Sandbox Code Playgroud)

num=${1:-5} 使用第一个参数,如果未提供,则默认值为 5。

然后你可以这样做:

$ d
# prints 5 lines
$ d 10
# prints 10 lines
Run Code Online (Sandbox Code Playgroud)

或者,如果您稍微更改您使用的选项:

alias d="dmesg|grep -iw usb|tail -n 5"
Run Code Online (Sandbox Code Playgroud)

然后你可以传递额外的-n选项:

$ d
# prints 5 lines
$ d -n 10
# prints 10 lines
Run Code Online (Sandbox Code Playgroud)

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

  • 对于像我这样在功能上遇到挑战的人:)简要说明将函数放在哪里可能会有所帮助...即`~/.bashrc`或`rc.local`或其他地方? (4认同)

Ron*_*Ron 10

您需要为此提供一个功能,如SO此处所述。请尝试以下操作:

foo() { /path/to/command "$@" ;}
Run Code Online (Sandbox Code Playgroud)

并调用foo

foo arg1 arg2 arg3
Run Code Online (Sandbox Code Playgroud)


Ser*_*nyy 7

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

别名不能接受参数,但我们可以“模拟”它。以我对这个问题的回答为例。

alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'
Run Code Online (Sandbox Code Playgroud)

这里发生的关键点:

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

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

alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'
Run Code Online (Sandbox Code Playgroud)

我们还可以使用分词来存储空格分隔的参数:

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "arg1 arg2"
arg1
arg2
Run Code Online (Sandbox Code Playgroud)

或者我们可以使用数组来提供多个参数:

bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";}  <<< "arg1 arg2"
arg2
arg1
Run Code Online (Sandbox Code Playgroud)

但这是一个好方法吗?

不必要。这种方法的问题在于它非常具体 - 不能轻易引用参数,这意味着我们只能使用没有空格的参数。

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "'arg1 with space' arg2"
'arg1
with space' arg2
Run Code Online (Sandbox Code Playgroud)

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

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