A script is given words, and keeps them
"do build.sh cosmos.asm" looked for a file called "build.sh cosmos.asm", because scriptOpen copied the whole rest of the line into the name. So a script could be told nothing, and a launcher - a script whose entire job is to hand on what it was told - could not exist. Now the name is cut off the front and what follows is kept whole. $1 to $9 are the words of it, walked out on demand, and $args is all of them. Nothing is stored per parameter, so there is no limit on how many a script may be handed and no second number to keep in step. Both ways of starting a script pass them on: "do" and typing the name. A word that was not given is an error that stops the script, like every other name this shell does not know. Expanding it to nothing would let a command run with an argument missing and then report success, which is what stop-on-failure exists to prevent. $args is always set inside a script, empty if it was given nothing, so "if same $args" can be asked. ---- And the count that describes the block was already wrong ---- Found while adding a field to it. The state one script keeps for another is saved by a single copy of a fixed number of bytes, and that number was 71 against a block of 77: six bytes of line position had been added in the middle of it years after the count was written. So the tail of every saved script was never saved, and #quiet in a helper stayed behind in the script that called it - the opposite of what this file's own comment promises and the README documents. The unsaved line position turned out not to matter, because a loop keeps its own copy in the block record. Nothing said so. Three numbers describe this block and all three now say so in a comment, and cosmosScriptNest ends on a helper that goes quiet and a caller that must not stay that way. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E2JrLzFvuFX9fgi1LDRjrW
This commit is contained in:
co-authored by
Claude Opus 5
parent
06af7e7fbb
commit
d9ebc76cf5
@@ -216,6 +216,52 @@ line comes from - the shell splits it, matches it and runs it without knowing th
|
||||
a file is reached by its whole name, the way `load` is for a program. See Starting An
|
||||
Application By Name.
|
||||
|
||||
### What A Script Is Given:
|
||||
|
||||
Whatever followed the name reaches the script, whichever way it was started - `do build.sh
|
||||
cosmos.asm` and `build.sh cosmos.asm` hand it the same thing.
|
||||
|
||||
| Name | What it stands for |
|
||||
| -- | -- |
|
||||
| `$1` to `$9` | The words it was given, counted from one. |
|
||||
| `$args` | All of them, exactly as they were typed. |
|
||||
|
||||
```
|
||||
#! script
|
||||
; build.sh <source>
|
||||
echo building $1
|
||||
cd /Source
|
||||
Asm $1
|
||||
```
|
||||
|
||||
**Nothing is stored per parameter.** The line is kept whole and the word wanted is walked out
|
||||
of it, so there is no limit on how many words a script may be handed and nothing to keep in
|
||||
step. `$args` is that line; `$1` is a word copied out of it.
|
||||
|
||||
**A word that was not given is an error**, exactly like any other name the shell does not
|
||||
know: `$2` in a script given one word says `nothing is set called 2` and stops the script.
|
||||
Expanding it to nothing would let a command run with an argument missing and report success,
|
||||
which is the failure the whole stop-on-error rule exists to prevent. A script that genuinely
|
||||
wants to work with or without something can ask `if same $args` - and `$args` is always set
|
||||
inside a script, empty if it was given nothing, so that question can always be asked.
|
||||
|
||||
**At the prompt they mean nothing**, and say so. There is no script there to have been given
|
||||
anything, so `$1` is a name nobody set.
|
||||
|
||||
**A script's own words win over anything `set`.** They are looked at before the eight named
|
||||
slots, so a parameter cannot be shadowed by something left lying about at the prompt.
|
||||
|
||||
**Each script has its own**, saved and restored with the rest of where it had got to. A script
|
||||
that hands different words to a helper still has its own when the helper returns. That is also
|
||||
what makes a **launcher** possible: a script whose whole body is one line handing on what it
|
||||
was told, without knowing what any of it means.
|
||||
|
||||
```
|
||||
#! script
|
||||
; /Apps/Lander - the launcher
|
||||
Packages/app.Lander/Lander $args
|
||||
```
|
||||
|
||||
```
|
||||
#! script
|
||||
; Build the system and put it where the machine will find it.
|
||||
@@ -325,7 +371,7 @@ CosmOS currently provides these built-in commands:
|
||||
| `dir` | List the files on the mounted disk and their sizes. |
|
||||
| `load <path>` | Read and validate an SBEX application, then place its code and data where its header requests. |
|
||||
| `run [words]` | Start the loaded application and make the rest of the line available to it as an argument. |
|
||||
| `do <script>` | Run the lines in a file as though they had been typed. See Scripts. |
|
||||
| `do <script> [words]` | Run the lines in a file as though they had been typed, and hand it those words. See Scripts. |
|
||||
| `echo [words]` | Say the rest of the line, or a blank line with nothing after it. |
|
||||
| `clear` | Empty the screen. |
|
||||
| `drive [n]` | Say which disk the shell is on, or go to another. See Several Disks. |
|
||||
|
||||
Reference in New Issue
Block a user