A string que você envia contém o seguinte:
$x$
que é expandido pelo bash como o conteúdo da variável $x
. Como $x
está vazio, $x$
é substituído por $
. Você pode evitar a expansão de variáveis usando aspas simples em vez de aspas duplas:
psql -d mydb -c 'CREATE FUNCTION f_showfile(myfile text) RETURNS text AS $x$ BEGIN RETURN pg_read_file(myfile, 0, 100000); END; $x$ LANGUAGE PLPGSQL SECURITY DEFINER;'