别名时的不同输出

别名时的不同输出

我有一个命令集作为别名,如下所示:

alias badalarm="cat ~/sagLogs/* | grep -I 'failed to generate expected' | awk '{print $4}' | sort | uniq | tee /dev/tty | wc -l" 

它给了我这个输出:

$ badalarm
alg-t1sg0103
alg-t1sg0104
all-t1sg0006
all-t1sg0009
input)
5

但是,如果我直接从 CLI 运行命令,我会得到:

$ cat ~/sagLogs/* | grep -I 'failed to generate expected' | awk '{print $4}' | sort | uniq | tee /dev/tty | wc -l
alg-t1sg0103
alg-t1sg0104
all-t1sg0006
all-t1sg0009
4

为什么别名版本会拾取其他文件?当我使用
cat ~/sagLogs/* | grep 'failed to generate expected'

我得到这个输出:

[...]
Apr:09:09:31:01:         >>>1 on all-t1sg0009 failed to generate expected 134
Apr:09:09:31:01:         >>>2 on all-t1sg0009 failed to generate expected 107
Apr:09:09:31:01:         >>>2 on all-t1sg0009 failed to generate expected 108
Apr:10:08:00:35:         >>>1 on all-t1sg0009 failed to generate expected 133
Apr:10:08:00:35:         >>>1 on all-t1sg0009 failed to generate expected 107
Binary file (standard input) matches

如何从别名中省略“标准输入”文件?

答案1

当您声明别名时,命令$4中的awk位于双引号内(因为整个别名字符串位于双引号内)。这意味着它将被 shell 扩展,很可能扩展为空字符串。$4单引号内的内容并不重要之内双引号。

相反,考虑使用 shell 函数,

badalarm () {
    cat "$HOME"/sagLogs/* |
    grep -I 'failed to generate expected' |
    awk '{ print $4 }' | sort -u |
    tee | wc -l
}

这避免了任何引用问题。

我还稍微缩短了管道,并将直接输出到 TTY 替换为输出到标准输出(以便 和 的输出都tee发送wc -l到那里)。

相关内容