Before functions and structure blocks existed, the best way to send someone a command block contraption was a "one-command-creation", which summoned a falling command block riding a falling command block riding a falling command block …
Currently there is a bug that breaks these: https://bugs.mojang.com/browse/MC-145113
But you can work around it by using other entities in between that instantly die. So you can for example do it like this:
summon falling_block ~ ~2 ~ {Time:1,BlockState:{Name:"command_block"},TileEntityData:{auto:1,Command:"say 1"},Passengers:[{id:"armor_stand",Health:0,Passengers:[{id:"falling_block",Time:1,BlockState:{Name:"command_block"},TileEntityData:{auto:1,Command:"say 2"},Passengers:[{id:"armor_stand",Health:0,Passengers:[{id:"falling_block",Time:1,BlockState:{Name:"command_block"},TileEntityData:{auto:1,Command:"say 3"}}]}]}]}]}
This executes all three commands, say 1
, say 2
and say 3
, in that order. If you also want to clean up afterwards, you can simply add another command block that removes the tower:
summon falling_block ~ ~2 ~ {Time:1,BlockState:{Name:"command_block"},TileEntityData:{auto:1,Command:"say 1"},Passengers:[{id:"armor_stand",Health:0,Passengers:[{id:"falling_block",Time:1,BlockState:{Name:"command_block"},TileEntityData:{auto:1,Command:"say 2"},Passengers:[{id:"armor_stand",Health:0,Passengers:[{id:"falling_block",Time:1,BlockState:{Name:"command_block"},TileEntityData:{auto:1,Command:"say 3"},Passengers:[{id:"armor_stand",Health:0,Passengers:[{id:"falling_block",Time:1,BlockState:{Name:"command_block"},TileEntityData:{auto:1,Command:"fill ~ ~-3 ~ ~ ~ ~ air"}}]}]}]}]}]}]}
Michael Dibbets/Tschallacka has created a generator in 2020 for these combined commands: https://www.tschallacka.de/minecraft/multiple-commands-generator (mirror, archive)
Enter your commands in the text field above the red button, one per line, without slashes in front (so like a function) and press the button. The bottom text field will then contain the combined command.
The generator does not validate if the commands are valid and it does not ignore empty lines or lines starting with #
, so you cannot simply copy-paste function files into it.
Licensing information on his profile (archive).