Really stupid update to this, but maybe it helps someone.
#!/usr/bin/env bash
CLASSES="src/classes"
TRIGGERS="src/triggers"
# failing glob expands to nothing, rather than itself
shopt -s nullglob
mkdir -p "$CLASSES"
mkdir -p "$TRIGGERS"
for f in "../$CLASSES/"*.cls; do
file=$(basename "$f")
fp=$(realpath "$f")
ln -sfv "$fp" "$CLASSES/$file.java"
done
for f in "../$TRIGGERS/"*.trigger; do
file=$(basename "$f")
fp=$(realpath "$f")
ln -sfv "$fp" "$TRIGGERS/$file.java"
done
# unset this behaviour if you don't want it in the rest of the script
shopt -u nullglob