I noticed that kill utility is able to accept arguments separated both by a space character and a newline:$ sleep 120 & sleep 240 &[1] 75341[2] 75342$ /bin/kill $(echo 75341 75342)[1]-  Terminated: 15          sleep 120[2]+  Terminated: 15          sleep 240$ sleep 120 & sleep 240 &[1] 75577[2] 75578$ /bin/kill $(echo -e 75577\n75578)[1]-  Terminated: 15          sleep 120[2]+  Terminated: 15          sleep 240$ Am I correct that this is solely up to utility itself if it accepts arguments for example separated by a newline?
What determines how program arguments needs to be separated?
shell;arguments
The arguments to a utility are passed as a list of strings, not as a single string. Therefore the utility doesn't have any notion of separator between arguments. The arguments are just separate elements in the list, there's nothing between them.The entity that splits a string into a list of arguments is the shell. The shell executes the command line like /bin/kill $(echo 75341 75342) by performing a series of expansions. Specifically:The command is broken down into tokens. I won't go into these rules in details; a token is basically either a punctuation sign or a sequence of characters not containing top-level whitespace. Here, the tokens are the string /bin/kill and the command substitution $(echo 75341 75342), which itself is built from the $() operator and the tokens echo and 75341 75342.The command in the command substitution operator is executed. It is a simple command, with the command name echo and the single argument 75341 75342. (The quotes are part of the shell syntax, they delimit a string, which becomes an argument to the command.)The output of the command is 75341 75342 where  is a newline character. The shell takes this output and strips off final newlines, yielding the string 75341 75342.Because the command substitution operator is used in a list context (outside of double quotes), it undergoes word splitting and filename expansion. Word splitting consists of taking the string and splitting it into a list of strings based on the value of the IFS variable. By default, IFS contains the characters space, tab and newline, so the string is split at any sequence of these characters: it becomes the list of two strings 75341 and 75342. Filename expansion doesn't change anything here.We now have a list of three strings: /bin/kill, 75341 and 75342. This is executed as the command /bin/kill with two arguments 75341 and 75342.With the command /bin/kill $(echo -e 75577\n75578), the expansions are pretty much the same. Step 3 produces the output 7534175342. At step 4, word splitting produces the same list 75341, 75342 as before, because a newline and a space are equally valid word separators. Thus step 5 executes the exact same command.As you can see, the step that determines what separates arguments is the word splitting step performed by the shell. You can experiment with this step by changing the value of IFS. For example, this produces again the same command:IFS=+/bin/kill $(echo 75341+75342)