Dê uma olhada nesta técnica com o bash 4.4:
function myf {
if ! [ -t 0 ];then
declare -a args=\($(</dev/stdin)\);
set -- "${args[@]}";
fi;
for i in "$@";do
echo "$i";
echo -----;
done
}
Teste:
$ function myf { if ! [ -t 0 ];then declare -a args=\($(</dev/stdin)\);set -- "${args[@]}"; fi;for i in "$@";do echo "$i";echo -----;done }
$ myf 1 "2 3" 4
1
-----
2 3
-----
4
-----
$ echo $'1 "2 3" 4'|myf
1
-----
2 3
-----
4
-----
O mesmo resultado pode ser alcançado também com:
$ echo 1 \"2 3\" 4 |myf
$ echo 1 "'2 3'" 4 |myf
Mas echo 1 "2 3" 4
não vai funcionar, porque as aspas duplas são ignoradas pelo bash nessa sintaxe:
$ echo 1 "2 3" 4
1 2 3 4