It seems to be a misleading error message.
If you look at the procps source, file common.h line 290:
extern unsigned format_modifiers; /* -c -j -y -P -L... */
-j implied format_modifiers flag to be set, which cause the error if used with user defined output:
if(format_list){
if(format_flags) return "Conflicting format options.";
if(format_modifiers) return "Can't use output modifiers with user-defined output";
if(thread_flags&TF_must_use) return "-L/-T with H/m/-m and -o/-O/o/O is nonsense";
return NULL;
}
A message like Can't use output format modifiers with user-defined output would be better.
FreeBSD ps doesn't have this issue, -j option cause ps to print information about user, pid, ppid, pgid, sid, jobc, state, tt, time, and command. Adding -o makes the output aggregated:
$ ps -j -o ppid,sid
USER PID PPID PGID SID JOBC STAT TT TIME COMMAND PPID SID
cuonglm 1196 1195 1196 1196 0 Ss 0 0:00.02 -sh (sh) 1195 1196
cuonglm 1233 1196 1233 1196 1 R+ 0 0:00.00 ps -j -o ppid,si 1196 1196
Output modifiers control how information displayed, while output format controls control what information displayed.
Example the s options is an output format control, because it added process signal information to ps output:
$ ps s
UID PID PENDING BLOCKED IGNORED CAUGHT STAT TTY TIME COMMAND
1000 12831 0000000000000000 0000000000000002 0000000000384004 0000000188013003 Ss pts/1 0:00 zsh
1000 13067 0000000000000000 0000000000000000 0000000000000000 0000000073d3fef9 R+ pts/1 0:00 ps s
f is an output modifier, because it changed how the output displayed:
$ ps f
PID TTY STAT TIME COMMAND
12831 pts/1 Ss 0:00 zsh
13238 pts/1 R+ 0:00 \_ ps f
Here the output was displayed as hierarchy.
-jasks for output in "jobs format", and-o ppid,sidask for output in "custom format". Which one do you want?ps -f -o ppid,sidworks without error?-fhas no impact. It should probably give an error too. Though I agree a "union" of formats could have been useful. I'm guessing you want to see-oppid,pid,pgid,sid,tty,time,cmd