primo post qui, ma è stato un lurker per anni. Ho cercato su Google per anni, ma non riesco a trovare quello che voglio (molti argomenti tematici che non richiedono ciò che l'argomento suggerisce che fa ...). non nuovo per awk o scripting, solo un po 'arrugginito :)awk: impostazione delle variabili di ambiente direttamente da uno script awk
sto provando a scrivere uno script awk che imposterà i valori della shell durante l'esecuzione - per un altro script bash da raccogliere e utilizzare in seguito. Non posso semplicemente usare lo stdout da awk per segnalare questo valore che voglio settare (cioè "esportare qualunque cosa = awk cmd here
"), come già indicato per un "file dei risultati" che viene creato da awkscript (in più ho più di una variabile da esportare in il codice finale comunque).
Come uno script di test di esempio, demo il mio problema:
echo $MYSCRIPT_RESULT # returns nothing, not currently set
echo | awk -f scriptfile.awk # do whatever, setting MYSCRIPT_RESULT as we go
echo $MYSCRIPT_RESULT # desired: returns the env value set in scriptfile.awk
all'interno scriptfile.awk, ho provato (senza sucesso)
1 /) costruzione e l'esecuzione di una stringa direttamente ad hoc:
{
cmdline="export MYSCRIPT_RESULT=1"
cmdline
}
2 /) utilizzando la funzione di sistema:
{
cmdline="export MYSCRIPT_RESULT=1"
system(cmdline)
}
... ma questi non funzionano. Ho il sospetto che questi 2 comandi stiano creando una subshell all'interno della shell da cui awk esegue, e facendo quello che chiedo (provato toccando i file come test), ma una volta che le chiamate "cmd"/system sono state completate, la subshell muore, sfortunatamente prendendo tutto ciò che ho impostato con esso - quindi le mie impostazioni di ambiente non cambiano dalla prospettiva di "chi chiama di awk".
variabili env quindi la mia domanda è: come si fa a realtà trova all'interno di awk direttamente, in modo che un processo chiamante può accedere a questi valori env dopo l'esecuzione awk ha completato? è effettivamente possibile?
oltre alle modalità adhoc/system di cui sopra, che ho dimostrato di non riuscire per me, non riesco a vedere come questo possa essere fatto (oltre a scrivere questi valori in un file "casuale" da qualche parte per essere raccolto e letto dal script chiamante, che comunque è un po 'sporco), quindi aiuto!
tutte le idee/suggerimenti/commenti accolti!
non si può fare. questa è una regola di base degli ambienti SO, i processi figli possono cambiare ** il loro ** ambiente ma non l'ambiente dei loro genitori. Il meglio che puoi fare è, (da uno script di shell) 'myParentVar = $ (echo" $ myParentVar "| awk '{sub (/ xxxx /," yyyy ", $ 0); stampa $ 0}')' (dove 'sub (...) 'è un segnaposto per tutte le modifiche che vuoi apportare a $ myParetntVar. Buona fortuna – shellter
thx per la risposta. Avevo paura che questo sarebbe stato il caso (impostazioni env padre/figlio e ambito di influenza), quindi penso che dovrò andare con un file di staging per queste variabili env per accedere allo script di bash. thx per confermare quello che pensavo comunque :( – user1603289
Ho avuto un problema anche con questo. Quello che ho fatto è stato scrivere l'output di awk in un file temporaneo ha quindi trovato il file temp. Funziona Non sono sicuro se è elegante ma ancora molto unio. – qodeninja