我有一个命令集作为这样一个别名:
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)
如何从别名中省略“标准输入”文件?
当你宣布你的别名,则$4
在awk
命令是双引号内(因为整个别名字符串是双引号)。这意味着它将被 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(使得两者的输出tee
和wc -l
被那里发送)。