我们正在从 SunOS 迁移到 Linux。我在wc -l
命令方面遇到一些问题。当我使用时wc -l <file_name>
,SunOS 在计数之前给出前导空格,而 Linux 则没有前导空格。这导致我的作业的行计数验证脚本失败。我尝试创建一个像这样的函数来在 Linux 中附加一些前导空格
wc () { /usr/bin/wc "$@" | sed 's/^/ /'; }
但是它不适用于所有行计数值。如何解决这个问题而不是更改我所有工作的 200 多个脚本。
答案1
实际上,我看到的 Linux(和 OSX)行为与 SunOS 相当匹配,只是位数有一些差异。
HPUX 遵循中的描述POSIX,它显示格式中没有前导空格:
"%d %d %d %s\n", <newlines>, <words>, <bytes>, <file>
您可以使用 awk 模仿 SunOS 的格式
#!/bin/sh
wc () {
/usr/bin/wc "$@" | \
awk '{
for (n = 0; n < NF-1; ++n) {
printf("%8d ", $n);
}
printf "%s\n", $NF; }'
}
wc "$@"
我故意在列之间留有空白,以避免 POSIX 基本原理中指出的问题。
答案2
SunOSwc
输出与 SYSVr4 的定义匹配。
我看不出与 POSIX 标准有任何真正的差异。甚至wc
ksh93 的内置功能也与SunOS
输出相匹配,最近的 Solaris 11 甚至使用了 ksh93 的wc
库实现,而ksh93
输出没有任何变化。
如果您的脚本在一个或另一个实现的输出方面存在问题wc
,则强烈提示应修复不可移植的脚本。