Bash - script dat zichzelf muteert - truukje gezocht

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • blorf
  • Registratie: December 2003
  • Laatst online: 22-08 16:22
Hallo, ik probeer een scriptje te maken dat tijdens het draaien een functie kan bij laden die vervolgens elders in het script aangeroepen kan worden. Ik weet niet of dit mogelijk is.

Simpel voorbeeld dat werkt: de content van een variabele letterlijk uitvoeren als shell commando:

code:
1
2
3
4
#!/bin/bash

X="echo hoi"
$X


Maar wat ik zou willen is een complete functie laden, dus in het kort:

code:
1
2
3
4
#!/bin/bash

X="function hoi () { echo "hoi"; }"        # string met correcte bash-syntax voor een functie van 1 regel
$X


dit resulteert in de error: "bash: function: command not found."
Ongeveer hetzelfde gebeurt bij deze pogingen:
X="hoi () { echo "hoi"; } # kale functiedeclaratie zonder 'function' keyword. Is ook correct (bash: hoi: command not found)

X="hoi () { echo \"hoi\"} # interne quotes escapen.
Werkt ook niet. Daar ligt het niet aan, het probleem zit hem ergens in het laden in "progam space", voor zover dat bij een shell script van toepassing is.

Heeft iemand enig idee of/hoe dit te doen is? Ik snap dat je hetzelfde kunt realiseren door tijdens de run gewoon scriptcode naar andere bestanden te schrijven en die te 'sourcen', maar ik wil er even vanuit gaan dat ik geen schrijfpermissies heb op een schijfstation van het systeem.

[ Voor 9% gewijzigd door blorf op 21-01-2012 11:37 ]

You are in a maze of little twisting passages, all different.


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Kijk even naar wat "source" doet...

file A:
code:
1
2
3
function blah() {
  echo blah
}


file B
code:
1
2
source A
blah


In uiterste nood heb je ook nog "eval".
Maar zoals het gezegde luidt: eval is evil

[ Voor 23% gewijzigd door H!GHGuY op 21-01-2012 11:35 ]

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • blorf
  • Registratie: December 2003
  • Laatst online: 22-08 16:22
Oei, snelle reactie. Daar dacht ik net ook aan, maar dat wil ik dus niet. We hebben geen storage ter beschikking. (sorry, even het topic ge-edit daarover)
eval is voor zover ik weet ook voor het letterlijk uitvoeren van een string als shell code, maar hoe laadt je daarmee een functie?

You are in a maze of little twisting passages, all different.


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Nu online

DataGhost

iPL dev

Misschien moet je dan uitleggen wat je precies wilt bereiken, als je wel code uit een bestand X wilt laden maar geen bestand X kan maken, en ook waarom je denkt dat jouw aanpak een goede manier is. Dat hoeft helemaal niet zo te zijn namelijk, probeer daarom even je doel en je zelfverzonnen mogelijkheid om het te bereiken los van elkaar te zien. Dat maakt het voor ons ook wat makkelijker.

Acties:
  • 0 Henk 'm!

  • blorf
  • Registratie: December 2003
  • Laatst online: 22-08 16:22
Verdomd, eval doet het. De bash-logica gaat me hier even boven de pet. 8)7

Dit bedoelde ik:
code:
1
2
3
4
5
#!/usr/local/bin/bash

A="function hoi () { echo "hoihoi"; }"
eval $A
hoi


Het kan dus. H!GHGuY thx

You are in a maze of little twisting passages, all different.


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Nu online

DataGhost

iPL dev

Grote vraag blijft nog: waarom? Lijkt me wel interessant om te weten en ik gok dat het op een andere manier vast ook wel kan.

Acties:
  • 0 Henk 'm!

  • blorf
  • Registratie: December 2003
  • Laatst online: 22-08 16:22
DataGhost schreef op zaterdag 21 januari 2012 @ 11:53:
Grote vraag blijft nog: waarom? Lijkt me wel interessant om te weten en ik gok dat het op een andere manier vast ook wel kan.
Ik denk niet met Bash zelf. Je zou met een extern tooltje kunnen uitzoeken waar de content van je scriptcode in je geheugen staat en die geforceerd wijzigen. Maar dan ben je aan het hacken oftewel 'reverse engineren' van je shell interpreter en wordt alles al snel instabiel en machine-afhankelijk.

You are in a maze of little twisting passages, all different.


Acties:
  • 0 Henk 'm!

Verwijderd

De vraag is: Waarom wil je dit doen? Wat probeer je te bereiken?
Dus even jouw "oplossing" negerend, wat is het eigenlijke "probleem"?

Acties:
  • 0 Henk 'm!

  • blorf
  • Registratie: December 2003
  • Laatst online: 22-08 16:22
Verwijderd schreef op zaterdag 21 januari 2012 @ 12:09:
De vraag is: Waarom wil je dit doen? Wat probeer je te bereiken?
Dus even jouw "oplossing" negerend, wat is het eigenlijke "probleem"?
Ik ben n.a.v. een weddenschap een poging aan het doen een bash script te maken die zelf een database, text-editor en later een fileserver wordt. Het mag maximaal 1 bestand omvatten. De basis van de editor en de database zijn klaar. Nu leek het me wel handig om, als extraatje. het script zichzelf te kunnen laten editen en opnieuw laden, aangezien we toch een editor hebben en een systeem waarmee database records aan het script zelf worden toegevoegd dmv zelf bedachte openen/sluiten tags. Ik snap dat dit een beetje gestoord is, maar ik vind het leuk en kan er een bedragje mee verdienen.

oplossing voor een functie van meer dan 1 regel:
code:
1
2
3
4
5
6
7
8
9
10
11
#!/usr/local/bin/bash

A=$(
  echo "function hoi ()"
  echo "{"
  echo "  echo hoihoi"
  echo "}"
)

eval "$A"
hoi

[ Voor 12% gewijzigd door blorf op 21-01-2012 13:36 ]

You are in a maze of little twisting passages, all different.

Pagina: 1