Seu ./sign gera o código do shell, portanto, ele deve ser avaliado como tal, seja por sh com seu sh -c ou o shell atual com eval :
eval "curl -v $(sign...)"
Com zsh , você também pode interpretar apenas as citações nele (não as expansões que esse código de shell pode fazer) com:
curl -v "${(@Q)${(z)"$(sign)"}}"
Onde (z) interpreta a citação e (Q) remove as aspas (e (@) entre aspas preserva os elementos vazios).
Se sign produz "foo bar" "$(echo test)" , o primeiro chamaria curl com foo bar e test como argumentos, enquanto o segundo chamaria curl com foo bar e $(echo test) como argumentos .