是否可以为重定向标准输出设置命令前缀的别名?

是否可以为重定向标准输出设置命令前缀的别名?

抱歉,标题没有提供足够的信息...

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

我基本上是在寻找类似的东西,这样我就可以替换>/dev/null,这样我就可以写,例如

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

有类似的东西吗?我可以覆盖现有运算符/编写新运算符吗?

答案1

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

但是,即使放在命令之前,重定向仍然有效,因此您可以使用别名来执行此操作:

alias quiet='>/dev/null '

在别名扩展末尾留下空格会让 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.

答案2

我会使用一个函数

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

quietly git pull

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

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

git pull | q

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

答案3

答案表明混叠是可能的彼得·科德斯。另一种方法是设置环境变量。这允许更自然的重定向语法:

export d0='/dev/null'

然后你可以使用它作为

git pull >$d0

答案4

是的,有可能,但是不是通过别名 - 而是使用 bash 的extdebug函数,它允许在执行命令之前对其进行任意更改(通过抑制原始命令并评估新命令)。

shopt -s extdebug
trap "code goes here" DEBUG

陷阱处理程序将获取 中的原始输入$BASH_COMMAND,并从处理程序返回 1 将取消原始命令。如果您输入多个;以 - 分隔的命令,则陷阱将针对每个命令单独调用。

具体来说:

shopt -s extdebug
trap 'if [[ $BASH_COMMAND == *!!!* ]]; then
          eval "${BASH_COMMAND//!!!/"> /dev/null"}"; false
      fi' DEBUG

这会将命令中的任意内容替换为任意!!!内容> /dev/null。您将无法再执行任何操作echo 'Hi!!!'

如果您只想在命令末尾匹配,这也很容易。

trap 'if [[ $BASH_COMMAND == *\ quietly ]]; then
          eval "${BASH_COMMAND% quietly} > /dev/null"; false
      fi' DEBUG

作为另一个示例,您可以使用它来将别名command please设为sudo command

trap 'case $BASH_COMMAND in *\ please) eval sudo ${BASH_COMMAND% *}; false; esac' DEBUG

还有另一种方法可以实现类似的功能:您可以使用 或 重新定义 Bash (readline)中的键bind~/.inputrc您也可以使用它来重新定义键序列

例如,每当您尝试键入时,inputrc entry"!!!": "> /dev/null"或等效的 shell 命令都会插入bind '"!!!": "> /dev/null"'文本。> /dev/null!!!

请注意,Bash 无法预测未来,这意味着如果你只想输入单身的 !,在它出现之前会有一点延迟——这是 Bash 在等待它是否与序列匹配。这可能会很烦人,所以不要绑定字母之类的东西。

事实上,绑定 Ctrl 或 Alt 热键会更好。例如,您可以Alt+Q使用 创建热键"\eq": "> /dev/null"

之前:https://superuser.com/a/1459211

相关内容