我有一个命令集作为别名,如下所示:
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
到那里)。