别名时的不同输出

Kub*_*oMD 5 grep bash alias

我有一个命令集作为这样一个别名:

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

它给了我这个输出:

$ badalarm
alg-t1sg0103
alg-t1sg0104
all-t1sg0006
all-t1sg0009
input)
5
Run Code Online (Sandbox Code Playgroud)

但是,如果我直接从 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
Run Code Online (Sandbox Code Playgroud)

别名版本怎么会选择其他文件?当我使用
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
Run Code Online (Sandbox Code Playgroud)

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

Kus*_*nda 8

当你宣布你的别名,则$4awk命令是双引号内(因为整个别名字符串是双引号)。这意味着它将被 shell 扩展,最有可能是一个空字符串。在双引号$4内的单引号没有关系。

相反,请考虑使用 shell 函数,

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

这避免了任何引用问题。

我还缩短了管道稍微和替换输出到标准输出,而不是直接输出到TTY(使得两者的输出teewc -l被那里发送)。