Ubuntu 与 RHEL 上的 Bash 差异

Ubuntu 与 RHEL 上的 Bash 差异

各位故障者,

我正在使用我在 RHEL 5.4 盒子上开发的一行程序,并且它运行完美:

TOTAL_RAM=`free | grep Mem: | awk '{ print $2 }'`; \ 
ps axo rss,comm,pid | awk -v total_ram=$TOTAL_RAM \
'{ proc_list[$2] += $1; } END { for (proc in proc_list) \
{ proc_pct = (proc_list[proc]/total_ram)*100; 
printf("%d\t%s\t%0.2f%\n", proc_list[proc],proc,proc_pct); }}' \
| sort -n | tail -n 10

在我的 RHEL 机器上输出类似下面的内容:

3736    logmon  0.01%
4156    EvMgrC  0.01%
4692    hald    0.01%
5020    ntpd    0.02%
6252    sshd    0.02%
7784    cvd     0.02%
9224    snmpd   0.03%
13068   dsm_sa_datamgr3 0.04%
23320   dsm_om_connsvc3 0.07%
4249864 mysqld  12.90%

但是在我的 Ubuntu 9.04 切片上我得到了这个:

awk: run time error: not enough arguments passed to printf("%d  %s      %0.2f%
")
        FILENAME="-" FNR=104 NR=104
33248   console-kit-dae 3.17

我认为一定是 bash 出了问题,但我真的没有做任何应该做的事情bash 特定。RHEL 框正在运行:

# yum info bash | grep -e Version -e Release
Version    : 3.2
Release    : 24.el5

还有 Ubuntu 盒子:

# apt-cache show bash | grep -e Version
Version: 3.2-5ubuntu1

我还没有深入研究这个问题,我想问问我的同伴们,看看你们是否曾经遇到过这个问题。

/弓

答案1

此命令在每个系统上显示什么:

echo $BASH_VERSION

并且由于错误消息是由 生成的awk,这表明了什么:

awk --version | head -n 1

此外克里斯的对于转义最后一个 % 的建议printf(可以使用反斜杠或将百分号加倍来​​完成),在 之前的行尾放置一个行继续反斜杠可能不会有什么坏处printf

答案2

我只能说,它在我的 Ubuntu 9.10 上运行得很好。但你的第四个%符号对我来说看起来有点奇怪 - 好像它依赖于一些不完美指定的行为。它不应该被转义吗?

TOTAL_RAM=`free | grep Mem: | awk '{ print $2 }'`; \ 
ps axo rss,comm,pid | awk -v total_ram=$TOTAL_RAM \
'{ proc_list[$2] += $1; } END { for (proc in proc_list) \
{ proc_pct = (proc_list[proc]/total_ram)*100; 
printf("%d\t%s\t%0.2f%%\n", proc_list[proc],proc,proc_pct); }}' \
| sort -n | tail -n 10

答案3

如果您只是寻找内存百分比,您可以执行以下操作:

top -b -n1

您将获得一些附加信息,但 awk 更易于处理。Top 允许批处理模式,这样所有 curses 垃圾都不会通过管道传输到其他应用程序。

相关内容