親スクリプトで定義された関数の使用

親スクリプトで定義された関数の使用

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 "$@"' _

おすすめ記事