我刚刚开始用 bash 编写脚本,并将其中一些脚本放在我的 Web 服务器上(该服务器位于我的虚拟 Debian 6.0.4 机器上)。
我已经在这台机器上安装了lighttpd。当我执行例如以下命令时:
TOP=`top -n 1`;
PS=`ps aux`;
echo "that's top\n" $TOP;
echo "ps\n" $PS;
没有任何内容被打印$TOP
,因为$PS
文本是在没有行分隔的情况下编写的(所有内容都写在一行中)。我怎样才能改变这个?
答案1
plain 的输出top
不适合在终端以外的任何设备上显示。您应该使用该-b
开关来获取纯文本输出。
并且行尾字符将被您正在执行的 shell 删除(替换为空格) - 您没有理由将这些输出存储在变量中,您只需在需要时运行这些命令即可。
我假设您将数据返回到网络浏览器。如果确实如此,如果您希望有机会正确显示输出,则应该执行一些最小的 HTML 格式设置。
尝试类似的方法:
#! /bin/sh
echo -e "Content-type: text/html\n"
echo "<html><body>"
echo "<h1>top</h1>"
echo "<pre>"
top -b -n 1
echo "</pre>"
echo "<h1>ps</h1>"
echo "<pre>"
ps aux
echo "</pre>"
echo "</body></html>"
答案2
您的输出未显示的原因是您没有遵循CGI协议。您必须在任何其他输出之前发送服务器响应标头。
TOP=`top -n 1`;
PS=`ps aux`;
echo "Content-Type: text/plain" # response header
echo "" # end of headers
echo "that's top\n" $TOP;
echo "ps\n" $PS;
使用 text/plain 将提供您想要的格式,但不会提供超链接等 HTML 用法。为此,请使用:
TOP=`top -n 1`
PS=`ps aux`
echo "Content-Type: text/html"
echo ""
echo "<html>"
echo "<head><title>command output</title></head>"
echo "<body>that's top<br/>"
echo "<pre>$TOP</pre>"
echo "<br/>ps<br/>"
echo "<pre>$PS</pre>"
echo "</body>"
答案3
如果这是在终端中运行的,当您回显它们时,您需要在变量周围加上引号以保留换行符。
TOP=`top -b -n 1`;
PS=`ps aux`;
echo "that's top";
echo "$TOP";
echo "ps";
echo "$PS";
如果输出发送到网页,那么您还需要 pre 标记
TOP=`top -b -n 1`;
PS=`ps aux`;
echo "<pre>";
echo "that's top";
echo "$TOP";
echo "ps";
echo "$PS";
echo "</pre>";