[RISOLTO] Inserire un heredoc interattivamente in uno script

Bash, Perl, Python, Ruby, ...

[RISOLTO] Inserire un heredoc interattivamente in uno script

Messaggioda Bileygr » 07/04/2018, 16:56

Ciao,
Come da titolo, sto cercando un modo per inserire un breve testo all' interno di uno script. Se io devo creare un file che contiene un testo, breve o lungo che sia, di solito utilizzo un heredoc, una cosa così insomma:

Codice: Seleziona tutto
cat << EOF > file.txt


A quel punto la shell mi propone un prompt in cui io posso scrivere quello che devo, e quando digito EOF esce salvandomi quello che ho scritto in file.txt.

Purtroppo il comando non funziona all' interno di uno script, che da un warning in cui dice di aspettare un EOF, crea il file file.txt ma ovviamente è vuoto.

Come è possibile fare una cosa del genere? Potrei utilizzare il comando read, ma dovrei scrivere tutto su una riga, uscendo con enter; ciò mi salverebbe tutto in una variabile, ma francamente la ritengo una porcata...

grazie
Ultima modifica di Bileygr il 09/04/2018, 19:27, modificato 1 volta in totale.
Bileygr
Full Member
Full Member
 
Messaggi: 136
Iscritto il: 02/02/2015, 14:22

Re: Inserire un heredoc interattivamente in uno script

Messaggioda Aki » 07/04/2018, 17:30

Bileygr ha scritto:sto cercando un modo per inserire un breve testo all' interno di uno script. [..]b di solito utilizzo un heredoc, [..] Come è possibile fare una cosa del genere? [..]

Il costrutto dello "Here Document" non serve ad ottenere quanto da te indicato, né è possibile modificare con tale costrutto lo script in esecuzione senza che l'interprete dello stesso ne tenga conto; puoi, invece, utilizzare il "built-in" source per inserire dinamicamente altri script all’interno dello script principale.
Aki
Global Moderator
Global Moderator
 
Messaggi: 7989
Iscritto il: 27/12/2007, 16:59

Re: Inserire un heredoc interattivamente in uno script

Messaggioda Bileygr » 07/04/2018, 20:53

Grazie per la risposta Aki. Quello che serve a me non è inserire un altro script nello script principale, ma è un comando che funzioni come il read, solo che anzichè salvare il contenuto digitato da tastiera in una variabile lo rediriga in un file.
Cerco di spiegarmi meglio:

Codice: Seleziona tutto
read -p "Scrivi il tuo nome: " NOME


In questo caso il nome è una parola sola (massimo due) e va benissimo il comando read che mi salva lo stdin nella variabile NOME.
Se però devo fare:
Codice: Seleziona tutto
read -p "Immetti una breve descrizione: " VARIABILE_INGUARDABILE

e ci scrivo dentro un testo di una cinquantina di parole, affinchè funzioni devo scrivere tutto su una riga (altrimenti con enter esce), e mi ritrovo con una variabile inguardabile di nome e di fatto... Se inoltre nel prosieguo dello script ho necessità di formattare il testo introdotto, devo redirigere il contenuto della variabille in un file:

Codice: Seleziona tutto
 echo $VARIABILE_INGUARDABILE > file.txt


Tutto ciò per funzionare funziona, ma di sicuro non è il modo più elegante e furbo per farlo (soprattutto per il fatto che se ti "scappa" un enter nel tentativo di andare a capo ti chiude lo stdin anzitempo...).

Ho trovato il modo di far funzionare lo heredoc (anche se non ho ben compreso per quale motivo in un modo funzioni e nell' altro no):

Anzichè fare

Codice: Seleziona tutto
cat << EOF > file.txt


se faccio

Codice: Seleziona tutto
cat > file.txt


lo script mi da il prompt per poter inserire il mio testo. L' unico inconveniente è che per uscire devo dare Ctrl-D su una nuova linea, perchè se do Ctrl-D su una riga con testo, tutto quello che è stato digitato da dopo l' ultimo enter ovviamente non viene rediretto nel file.txt. Questa soluzione è meglio della precedente ma non è il massimo proprio per quest' ultimo inconveniente.

Quello che chiedevo era se esista un comando che permetta di prendere una stringa arbitrariamente lunga in ingresso e la rediriga in un file, che funzioni all' interno di uno script.
Bileygr
Full Member
Full Member
 
Messaggi: 136
Iscritto il: 02/02/2015, 14:22

Re: Inserire un heredoc interattivamente in uno script

Messaggioda Aki » 08/04/2018, 9:24

Bileygr ha scritto:Ho trovato il modo di far funzionare lo heredoc (anche se non ho ben compreso per quale motivo in un modo funzioni e nell' altro no); Anzichè fare:
Codice: Seleziona tutto
cat << EOF > file.txt
se faccio
Codice: Seleziona tutto
cat > file.txt
lo script mi da il prompt per poter inserire il mio testo.

il secondo costrutto non è un "here document", ma la ridirezione dello standard input al file file.txt tramite il comando cat.

Bileygr ha scritto:L' unico inconveniente è che per uscire devo dare Ctrl-D su una nuova linea, perchè se do Ctrl-D su una riga con testo, tutto quello che è stato digitato da dopo l' ultimo enter ovviamente non viene rediretto nel file.txt.

Non mi risulta questo comportamento, quello che mi risulta è che se non impartisci l'ultimo "return" devi premere due volte CTRL-D.

Bileygr ha scritto:ci scrivo dentro un testo di una cinquantina di parole, affinchè funzioni devo scrivere tutto su una riga (altrimenti con enter esce), e mi ritrovo con una variabile inguardabile di nome e di fatto... [..] chiedevo se esista un comando che permetta di prendere una stringa arbitrariamente lunga in ingresso e la rediriga in un file, che funzioni all' interno di uno script.

Da quanto scrivi, sembra che tu desideri anche di poter effettuare un editing multiline, oltre che poter digitare una stringa arbitrariamente lunga; a tal fine, puoi usare il comando dialog dell'omonimo pacchetto (da installare preventivamente); ad esempio:
Codice: Seleziona tutto
dialog --editbox file.txt 10 40 2>file.txt
Aki
Global Moderator
Global Moderator
 
Messaggi: 7989
Iscritto il: 27/12/2007, 16:59

Re: Inserire un heredoc interattivamente in uno script

Messaggioda Bileygr » 09/04/2018, 19:26

lo sapevo che avresti tirato fuori il coniglio dal cilindro... era proprio il comando che mi serviva, il giusto attrezzo per fare il lavoro che serviva a me.

Grazie mille
Bileygr
Full Member
Full Member
 
Messaggi: 136
Iscritto il: 02/02/2015, 14:22

Re: Inserire un heredoc interattivamente in uno script

Messaggioda Aki » 09/04/2018, 21:33

Bileygr ha scritto:lo sapevo che avresti tirato fuori il coniglio dal cilindro... era proprio il comando che mi serviva, il giusto attrezzo per fare il lavoro che serviva a me.

Felice di esserti stato d'aiuto.
Aki
Global Moderator
Global Moderator
 
Messaggi: 7989
Iscritto il: 27/12/2007, 16:59


Torna a Scripting

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite