是否可以为命令前缀添加别名以重定向标准输出?

CIs*_*ies 11 command-line bash

抱歉,标题不提供信息...

我正在寻找类似的东西,这样我就可以缩短重定向标准输出。我知道执行前面带有空格的命令不会将其写入历史记录,并且有一些“神奇”运算符,例如“!!”等。

我基本上正在寻找类似的东西,这将允许我替换>/dev/null,所以,我将能够写,例如

git pull !!!这相当于git pull>/dev/null

有这样的事吗?我可以覆盖现有的运算符/编写新的运算符吗?

Pet*_*des 26

别名扩展仅查看一行的第一个标记/单词,因此无法被git pull !!!别名扩展替换。

但是,即使放置在命令之前,重定向也会起作用,因此您可以使用别名来执行此操作:

alias quiet='>/dev/null '
Run Code Online (Sandbox Code Playgroud)

在别名扩展末尾留下空格会使 bash 考虑别名扩展的下一个标记。(这就是为什么这样做很常见alias sudo='sudo ')。所以这甚至不会破坏你的别名。例子:

$ ll *.s xyz
ls: cannot access 'xyz': No such file or directory
-rw-r--r-- 1 peter peter 12 Mar  6 20:15 a64.s
-rw-r--r-- 1 peter peter 72 Mar  6 21:03 arm.s
-rw-r--r-- 1 peter peter 30 Mar 15 17:38 foo.s
-rw-r--r-- 1 peter peter 42 Mar  6 13:12 mips.s
$ quiet ll *.s xyz     # ll alias expanded successfully, stdout discarded
ls: cannot access 'xyz': No such file or directory
$                      # stderr is not redirected.
Run Code Online (Sandbox Code Playgroud)

  • 小警告:重定向在*简单*命令之前起作用。你不能对 1 2 3; 中的 x 执行类似 `> /dev/null 的操作;回显 $x; 完成`。 (3认同)

gle*_*man 16

我会用一个函数

quietly() {
    # execute the remaining arguments as a command, but redirect output
    "$@" > /dev/null
}

quietly git pull
Run Code Online (Sandbox Code Playgroud)

或者读取 stdin 并丢弃它的函数:

q() { cat > /dev/null; }

git pull | q
Run Code Online (Sandbox Code Playgroud)

这些都不是重定向 stderr:如果出现问题,您应该知道它。

  • @PeterCordes Alias 扩展的工作方式与 shell 解析的其余部分(包括函数的解析)有很大不同,并且当您进入其边缘情况时可能会更加混乱。这就是为什么手册页的 [ALIASES 部分](https://man7.org/linux/man-pages/man1/bash.1.html#ALIASES) 说:“对于几乎所有用途,别名都被 shell 函数取代”。 (5认同)
  • 函数比简单的别名灵活得多。除了一些琐碎的事情之外,我几乎不再使用别名。 (2认同)

van*_*ium 5

正如Peter Cordes的回答所示,混叠是可能的。另一种方法是设置环境变量。这允许更自然的重定向语法:

export d0='/dev/null'
Run Code Online (Sandbox Code Playgroud)

然后您可以将其用作

git pull >$d0
Run Code Online (Sandbox Code Playgroud)