0

相互に呼び出すいくつかの関数を使用してシステム情報を出力するスクリプトを作成しようとしています。パイプされたコマンドの I/O の処理方法の何が問題なのか、誰か教えてもらえますか?

#!/bin/bash

function lyellow() {
    lyellow="$1"
    echo -e -n "\033[0;33m$lyellow"
    echo -e -n '\033[0m \n'
}


function red() {
    RED="$1"
    echo -e -n "\033[0;31m$RED"
    echo -e -n '\033[0m \n'
}

function lcyan() {
    LCYAN="$1"
    echo -e -n "\033[0;36m$LCYAN"
    echo -e -n '\033[0m \n'
}

function lgreen() {
    LGREEN="$1"
    echo -e -n "\033[1;32m$LGREEN"
    echo -e -n '\033[0m \n'
}

field ()
{
        HEADER="$1"
        SUB1="$2"
        COM1="$3"
        SUB2="$4"
        COM2="$5"
        echo -e "$(red "$(echo -e "### $HEADER ###")")"
        echo -e "$(lyellow "$(echo -e "$SUB1")")\n$(lcyan "$(echo -e "$($COM1)")")"
        echo -e "$(lyellow "$(echo -e "$SUB2")")\n$(lcyan "$(echo -e "$($COM2)")")"
}

#set -x pipefail

SEP=$(seq -s= 40|tr -d '[:digit:]')

echo $SEP
echo -e "$(lgreen "$(hostname -f) :: $(hostname -i)")"
echo $SEP

#OS
field   "Operating System" \
        "Kernel:" "/bin/uname -srp" \
        "Release:" "cat /etc/redhat-release"

echo $SEP

#DISK
field   "Storage Devices" \
        "Mounted Devices:" "mount|column -t" \
        "Disk Free:" "df -kh|column -t"

echo $SEP

#Example
lcyan "$(echo -e "$(df -kh | column -t)")"

exit 0

「#OS」「フィールド」呼び出しからの出力は機能します。しかし、「#DISK」呼び出しは、「column -t」へのパイプが好きではありません。「#Example」の下で、color 関数はリテラル パイプの「column -t」を呼び出します。出力は次のようになります。

[root@CLFT1Q ~]# sh sysinfo.sh
=======================================
CLFT1Q.local :: 10.9.19.70
=======================================
### Operating System ###
Kernel:
Linux 2.6.18-348.3.1.el5 i686
Release:
Red Hat Enterprise Linux Server release 5.9 (Tikanga)
=======================================
### Storage Devices ###
sysinfo.sh: line 36: /bin/mount|column: No such file or directory
Mounted Devices:

df: invalid option -- |
Try `df --help' for more information.
Disk Free:

=======================================
Filesystem                    Size   Used  Avail  Use%  Mounted   on
/dev/mapper/vgsystem-lv_root
3.9G                          3.3G   421M  89%    /
/dev/mapper/vgsystem-lv_var
4.9G                          2.3G   2.4G  49%    /var
/dev/mapper/vgsystem-ora
3.0G                          1008M  1.9G  36%    /ora
/dev/sda1                     99M    25M   69M    27%   /boot
tmpfs                         1014M  0     1014M  0%    /dev/shm
clnsa05:/vol/ftpnfsqa1/ftp
29G                           25G    4.2G  86%    /ftp
4

1 に答える 1

1

に変更"$($COM1)""$(eval "$COM1")"、 についても同様です$COM2。変数の展開は、パイプラインのようなコマンド メタ文字ではなく、単語の分割とワイルドカードの展開についてのみスキャンされます。evalコマンドラインとして再帰的に処理するために使用する必要があります。

于 2013-05-10T21:41:35.867 に答える