COPY command only works as command line argument, not as part of script
The answer was to be found in this pgsql-sql mailing list archive:

psql's interpretation of &quot;stdin&quot; when reading from a file
is that the COPY data is to come from that same file (look at the script
produced by pg_dump for an example).  So it reads to the end of the
file, which is right away --- otherwise you'd get some incorrect-data
errors.  The data sourced from the cat command is never noticed at all.

The thread also lists 4 solutions for achieving the same thing:
1) using COPY FROM STDIN
cat event.csv | psql -c &quot;$(cat event.sql)&quot;

2) using COPY FROM STDIN
psql -f  &lt;(cat event.sql event.csv)

3) using \COPY FROM PSTDIN
cat event.csv | psql -f event.sql

4) using \COPY FROM STDIN
psql -f  &lt;(cat event.sql event.csv &lt;(echo &quot;\.&quot;))