The compiled executable must contain a parser that is able to read external program code. The program code need not look like C or Python or xyz - it can be any kind of descriptive data that is suitable for the purpose in question. For example swedish, or morse.
The external program code needs to have a syntax, so that the parser understands it as it reads it character by character. The syntax may describe (and code may contain) identifiers, numeric values, operators etc.
The parser is fixed (compiled) but it works on flexible, external code.
The compiled executable must have an internal API to it's relevant functionality. so that the parser can perform actions. Most likely there must be (bi-directional) access to the executable's internal data as well, or the parser must provide some kind of data storage and housekeeping.
The parser can read the external program code at executable's startup, or it can read (parts of) it ad hoc, or it can re-read it per each frame (would be inefficient), or the code can even be hand-typed and posted to the parser as it gets ready (like: "move unit X forward 5 steps"[enter]).
Essentially, the external code is not fixed - it can change any year, day or minute, but still the executable need not be re-compiled. Only the resulting behaviour, hosted by the executable, changes.
The text you are reading right now is (kind of, and even more if it was spoken) interpreted because you "execute" it in your brains while reading it, without knowing what next sentence says (or even if it possibly, sneakily changes right now). As opposed to Stack Overflow (pre)compiling the entire story into bytecode in your brains, which then executes it - and ofc then it could not change any longer.
The phenomen ongoing is interpretion. Scripting is only the act of creating a deSCRIPTion, or writing. All computer coding is imo scripting - we describe what we want to happen. The word "scripting" has got a somewhat tilted meaning, but so be fine. We know what we mean.
There is absolutely nothing extraordinary with interpreted languages, and it is in no way a disputable term. A multitude of them exist, and some of the very oldest ones are interpreted as opposed to compiled. In an interpreted language one might for example type by hand:
sock = Socket.New(AddressFamily.InterNetwork, SocketType.Stream ProtocolType.Tcp) [ENTER]
... and then go for a 30... no, 45 minute coffee break :-). When returning, "sock" exists and is ready for further use by typing more by hand, or letting the interpreter's automation continue with it.