抱歉,标题没有提供足够的信息...
我正在寻找类似的东西,可以让我缩短重定向 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
答案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"
。