test.shに次のスクリプトを作成しました。
#!/bin/sh
compare() {
if [ $1 != root ]; then
echo "Fail" >> CAT1.txt
fi
}
awk -F: '$4 == 0' /etc/passwd | cut -d: f1 | xargs -n1 -i bash -c 'compare "$@"' _
このスクリプトを実行すると、次のエラーが発生します。
_: compare: command not found
ベストアンサー1
関数は、その関数が定義されているシェルの内側にあります。別のプログラムを実行すると、そのプログラムがシェルであってもその機能を見ることはできません。
(関数はサブシェルからアクセスできます。つまり、実行中のシェルのコピーを作成して角かっこ内のエントリを実行したり、コマンドの置き換えなど(…)
の$(…)
ためにアクセスしたりできます。ただし、別のプログラムではアクセスできません(例:ときsh -c …
)。
これを使用するスクリプトで関数を定義します。
#!/bin/sh
awk -F: '$4 == 0' /etc/passwd | cut -d: f1 | xargs -n1 -i bash -c '
compare() {
if [ $1 != root ]; then
echo "Fail" >> CAT1.txt
fi
}
compare "$@"' _
(私はこれがおもちゃの例であり、これらすべてが単純なawkスクリプトで実行できると仮定します。)
あるいは、環境を介してbashのサブインスタンスに関数をエクスポートできるbash機能を使用できます。これはbash固有の機能なので、親スクリプトはshではなくbashを実行する必要があります。
#!/bin/bash
compare() {
if [ $1 != root ]; then
echo "Fail" >> CAT1.txt
fi
}
export -f compare
awk -F: '$4 == 0' /etc/passwd | cut -d: f1 | xargs -n1 -i bash -c 'compare "$@"' _