スクリプトの全機能に問題があります

スクリプトの全機能に問題があります

Solarisでオンラインネットワーク/シェルサービスを検出したいです。この目的のために、次のスクリプトを作成しました。

compare_ser()
{
if [ "$1" != "" ]; then
echo "True" >> Solaris.txt
fi
}
export -f compare_ser
svcs network/shell | cut -d ' ' -f1 | grep "online" | xargs -n1 bash -c 'compare_ser $@'

端末で実行すると、svcs network/shell | cut -d ' ' -f1 | grep "online" | xargs -n1 echo次の結果が表示されます。

online
online

しかし、私のスクリプトには何も表示されません。何の問題がありますか?

答え1

私はより短い方法があると信じています。

svcs network/shell | awk '/online/ {system("bash -c \"compare_ser "$1"\"")}'

異議申し立て者の皆さん、あなたの決定を説明してもらえますか? Linuxとは何か理解していますか?上記のスクリプトは機能するスニペットであり、これを行う方法はおそらく何百万ものものです。だから説明を求めます。

答え2

これを使用してください:

svcs network/shell | cut -d' ' -f1 | grep "online" | xargs -n1 -I{} bash -c 'compare_ser {}'

{}によって生成された各値を補間しますxargs。コマンドライン引数を挿入しようとしましたが、$@引数がありません。

答え3

位置パラメータを解析するには、文字列の周囲に二重引用符を使用する必要があります。

svcs network/shell | cut -d ' ' -f1 | grep "online" | xargs -n1 bash -c "compare_ser $@"

答え4

svcs network/shell | sed -n '/^online /c\
True' >> Solaris.txt

...ほとんど似ています。

これ理由ただし、シェル関数はシェルコードであり、既に知っているシェルによって実行される必要があるため、スクリプトには何も表示されません。関数が機能するには、関数を実行するシェルで最初に宣言する必要があります。

ただし、 を呼び出すと、xargs呼び出すプログラムは別のプログラムを呼び出します。もちろん、そのプログラムはシェルですが、xargs新しいシェルを呼び出すプロセスはいいえ現在のシェルで定義されているシェル機能を理解します。

もちろん、export -fシェルがこれが何を意味するのかを理解していれば、これを行うことができますが、Solarisシステムを使用している場合はkshそうではありません。とにかくこれひどい目標が実際に達成される場合、目標達成の効率は非常に低い。

関連情報