Má ovlivnit, alespoň bash v mém okolí, ale velmi nepříjemným způsobem . Viz tyto kódy. První a.sh
:
#!/bin/sh
echo "First echo"
read y
echo "$y"
echo "That's all."
b.sh
:
#!/bin/sh
echo "First echo"
read y
echo "Inserted"
echo "$y"
# echo "That's all."
Proveďte
$ cp a.sh run.sh
$ ./run.sh
$ # open another terminal
$ cp b.sh run.sh # while 'read' is in effect
$ # Then type "hello."
V mém případě je výstup vždy:
hello hello That's all. That's all.
(Samozřejmě je mnohem lepší to automatizovat, ale výše uvedený příklad je čitelný.)
[upravit překlad] Toto je nepředvídatelné, tak nebezpečné. Nejlepším řešením je , jak je popsáno zde vložte vše do složené závorky a před uzavírací složenou závorku zadejte "exit" . Přečtěte si dobře propojenou odpověď abyste se vyhnuli nástrahám.
[přidáno] Přesné chování závisí na jednom novém řádku navíc a možná také na vaší unixové chuti, souborovém systému atd. Pokud chcete jednoduše vidět nějaké vlivy, jednoduše přidejte "echo foo/bar" do b.sh před a/nebo za řádek „čtení“.
Zkuste toto... vytvořte soubor s názvem bash-is-odd.sh
:
#!/bin/bash
echo "echo yes i do odd things" >> bash-is-odd.sh
To ukazuje, že bash skutečně interpretuje skript "as you go". Editace dlouhotrvajícího skriptu má skutečně nepředvídatelné výsledky, vkládání náhodných znaků atd. Proč? Protože bash čte od poslední pozice bajtu, úpravy posunou umístění aktuálního čteného znaku.
Bash je jedním slovem velmi, velmi nebezpečný kvůli této "funkci". svn a rsync
při použití s bash skripty jsou obzvláště znepokojující, protože ve výchozím nastavení "slučují" výsledky... úpravy na místě. rsync
má režim, který to opravuje. svn a git ne.
Předkládám řešení. Vytvořte soubor s názvem /bin/bashx
:
#!/bin/bash
source "$1"
Nyní použijte #!/bin/bashx
ve skriptech a vždy je spouštějte s bashx
místo bash
. Tím je problém vyřešen – můžete bezpečně rsync
vaše skripty.
Alternativní (in-line) řešení navržené/testované @AF7:
{
# your script
}
exit $?
Složené závorky chrání před úpravami a ukončení chrání před připojením. Samozřejmě bychom všichni byli mnohem lepší, kdyby bash přišel s možností, jako je -w
(celý soubor), nebo něco, co to udělalo.
Rozdělte svůj skript na funkce a pokaždé, když se funkce nazývá source
to ze samostatného souboru. Poté můžete soubory kdykoli upravit a váš spuštěný skript provede změny, až jej příště získá.
foo() {
source foo.sh
}
foo