シェルスクリプトで自作関数にパイプの結果を渡す

やりたいこと

1
2
3
4
5
6
7
my_func () {
argument=$(パイプで受け取る)

echo "my_func: $argument"
}

echo "hoge" | my_func # my_func: hoge

Answer

1
2
3
4
5
6
7
8
9
10
11
12
13
my_func () {
if [ -p /dev/stdin ]; then
echo "*** From pipe ***"
argument=$(cat /dev/stdin) # alternative: $(cat -)
else
echo "*** NOT from pipe ***"
argument=$1
fi

echo "my_func: $argument"
}

echo "hoge" | my_func # my_func: hoge
  • [ -p /dev/stdin ]の中の-pは対象がパイプファイルであれば真となる。
  • cat-を与えると標準入力から読み込みを行う。cat /dev/stdincat -は同義。

xargsを使う場合

xargs経由で引数を与えたいケースもあるが、通常はxargsから自作関数は呼べない。
よくある手としてmy_func関数をエクスポートしておき、bash -cで実行する。
この場合、my_func内では引数は$1として与えられるので注意。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
my_func () {
if [ -p /dev/stdin ]; then
echo "*** From pipe ***"
argument=$(cat /dev/stdin) # alternative: $(cat -)
else
echo "*** NOT from pipe ***"
argument=$1
fi

echo "my_func: $argument"
}

echo "hoge" | my_func # my_func: hoge


export -f my_func # to use my_func from xargs
echo "hoge" | xargs -I {} bash -c "my_func {}"

結果は以下となる。xargs bash -c経由の場合は*** NOT from pipe ***のパスを通る。

1
2
3
4
*** From pipe ***
my_func: hoge
*** NOT from pipe ***
my_func: hoge

参考