GNU/Linux >> Znalost Linux >  >> Linux

Upravte skript shellu, když je spuštěn

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

Linux
  1. Časový limit ve skriptu Shell?

  2. Na jakém Shellu běžím?

  3. Neočekávané chování skriptu Shell?

  1. Shell skript s funkcí a parametrem jako proměnnými?

  2. Neočekávané Eof při hledání shody „““ – Bash Script?

  3. Skript Shell visí na příkazu Mail?

  1. Odesílání HTML pošty pomocí shell skriptu

  2. Zkontrolujte konektivitu databáze pomocí skriptu Shell

  3. Odeslání pošty z linuxového shell skriptu