Skip to content

Come si fa a togliere il buffer dall'output passato da un comando interattivo in una pipeline che termina con `tee`?

Cerchiamo nel mondo online per fornirti la risposta alla tua domanda, se continui con i dubbi puoi lasciare la tua preoccupazione e ti risponderemo con piacere.

Soluzione:

Sostituzione del processo 1 consente di trasformare un script mentre viene scritto.

È possibile utilizzare script -q >(./dewtell >>outfile) brew args... al posto di script -aq outfile brew args... per scrivere un log con sequenze di escape rimosse, dove ./dewtell è il comando che esegue lo script che le rimuove. Su sistemi diversi dalle versioni relativamente recenti di macOS o FreeBSD, il comando sarà leggermente diverso, in quanto diversi sono i comandi script supportano opzioni diverse. Vedere sotto per tutti i dettagli.

La storia finora (comprese le soluzioni alternative)

La vostra soluzione

La vostra brew esegue numerosi altri programmi che generano output come sottoprocessi, come ad esempio ./configure script e makee si è scoperto che il comando brewa tee con brew args... 2>&1 | tee -a outfile fa sì che l'output (di almeno alcuni di questi sottoprocessi) venga bufferizzato e non venga visualizzato sul terminale in tempo reale.

Si è scoperto che usando script, eseguendo script -aq, ha risolto questo problema mantenendo l'output standard di un terminale 2 e che è possibile passare anche -k se si vuole che il proprio input sia registrato anche in situazioni in cui non viene riprodotto sul terminale mentre viene digitato. Si è scoperto inoltre che la versione estesa di dewtell dello script Perl di Gilles per rimuovere le sequenze di escape dai file pulisce efficacemente il dattiloscritto generato, trasformandolo in ciò che serve.

La differenza tra lo script originale di Gilles e la versione estesa di dewtell è che, mentre entrambi rimuovono le sequenze di escape, incluse ma non limitate a quelle che specificano i cambiamenti di colore, lo script di dewtell rimuove anche i caratteri di ritorno a capo ($'r', rappresentato come ^M in vim e nell'output di cat -v) e i caratteri di backspace ($'b', rappresentato come ^H in vim e nell'uscita di cat -v) e gli eventuali caratteri che sembrano aver cancellato.

Problemi con alcune implementazioni di Perl

Si è detto che lo script ha bisogno di un interprete Perl "relativamente recente". Ma non richiede alcuna funzionalità più recente con use o comunque sembra fare affidamento su di esse, e un mio amico che utilizza macOS 10.11.6 El Capitan ha verificato che funziona con il perl 5.8.12 fornito dal sistema, quindi non so perché (o se) vi serva un perl più recente. Mi aspetto la maggior parte possa usare il perl che ha.

Ma lo script ha fallito su Mac OS X 10.4.11 Tiger (PPC) con il perl 5.8.6 fornito dal sistema, il quale ritiene erroneamente (almeno sul mio sistema) che m non faccia parte della classe di caratteri [@-~]anche con LC_COLLATE=C o LC_ALL=C e anche se il sistema fornisce grep, sed, pythone ruby non presentano questo problema. Ciò ha fatto sì che pezzi di sequenze di escape che specificano il colore rimanessero nell'output, poiché le sequenze non corrispondevano a (?:e[|x9b) [ -?]* [@-~] e corrispondevano all'alternativa successiva e. al suo posto. Con perlbrewho installato perl 5.27.5, 5.8.9 e anche 5.6.2 su quel sistema; nessuno ha avuto il problema.

Se si ha bisogno o si vuole eseguire lo script con un interprete Perl installato altrove rispetto a /usr/bin/perlsi può cambiare la riga hashbang all'inizio con il percorso corretto; oppure si può cambiare in /usr/bin/env perl se il percorso desiderato è perl appare per primo nel percorso, cioè se verrebbe eseguito se si digitasse perl e si preme Invio oppure si può invocare esplicitamente l'interprete con il nome del file dello script come primo argomento, ad es, /usr/local/bin/perl dewtell invece di ./dewtell.

Modi per mantenere o sostituire il dattiloscritto originale

Alcuni utenti che devono rimuovere le sequenze di escape da un dattiloscritto vorranno mantenere anche il vecchio dattiloscritto non elaborato. Se un tale utente desidera elaborare un dattiloscritto chiamato dirty.log e scrivere l'output in clean.logsi eseguirà il comando ./dewtell dirty.log > clean.log, se necessario sostituendo ./dewtell con qualsiasi altro comando che esegua lo script di dewtell (o un altro script che si desidera utilizzare).

Per modificare il dattiloscritto "sul posto", si può passare il comando -i a perl, eseguendo perl -i.orig dewtell typescript dove typescript è il dattiloscritto generato da script, .orig è il suffisso da usare per il file di backup e dewtell è lo script Perl. Oppure si può eseguire perl -i dewtell typescriptche scarta l'originale perché non viene fornito alcun suffisso di backup. Questi metodi non funzionano con tutti gli script Perl, ma funzionano con questo perché usa <> per leggere l'input e <> in Perl rispetta -i.

Avete usato sponge per riscrivere le modifiche al dattiloscritto originale. Anche questo è un metodo valido e affidabile, anche se richiede l'installazione di moreutils.

Impedire che le sequenze di escape vengano mai registrate

La domanda che rimane è come scrivere un log che abbia le sequenze di escape rimosse in primo luogo. Come si dice:

[T]potrebbe esserci un modo per unire tutto questo in un'unica pipeline, ma non sono stato in grado di capirlo al momento della stesura di questo documento; ulteriori commenti o risposte che mostrino come...

Usare la sostituzione dei processi invece di una pipeline.

Il problema è che script nella maggior parte dei sistemi (tutti?) non ha un'opzione per supportare queste trasformazioni. Poiché script scrive su un file il cui nome è specificato dall'utente o è predefinito a typescript--non allo standard output--piping da script non influisce su ciò che viene scritto nel dattiloscritto.

Posizionare l'elemento script alla destra dell'operatore pipe (|) per eseguire il pipe a non è una buona idea. Nel caso specifico, questo è dovuto al fatto che l'output di brew o dai suoi sottoprocessi veniva bufferizzato quando il suo output standard era una pipe, quindi non appariva quando era necessario vederlo.

Anche se questo problema fosse risolto, non conosco un modo ragionevole per usare un file pipeline1 insieme a script per svolgere questo compito.

Ma si può fare con la sostituzione del processo.3 Nella sostituzione di processo 1 (spiegata anche qui), si scrive <(command...) oppure >(command...). La shell crea una pipe denominata e la utilizza come standard output o input, rispettivamente, per una sottoguscia in cui command... viene eseguita. Il testo <(command...) o >(command...) viene sostituito con il nome del file della pipe denominata, ovvero il testo sostituzione--in modo da poterla passare come argomento a un programma o usarla come bersaglio di un reindirizzamento.

  • Utilizzo <(command...) per eseguire command... come il suo output è il contenuto di un file leggere da.4
  • Utilizzare >(command...) per eseguire command... come il suo input è il contenuto di un file che scrivere su.4

Non tutti i sistemi supportano le named pipe, ma la maggior parte lo fa. Non tutte le shell supportano la sostituzione dei processi, ma Bash sì, a patto che sia in esecuzione su un sistema in grado di supportarla, che la vostra versione di Bash non ne abbia omesso il supporto e che la modalità POSIX sia disattivata nella shell. In Bash di solito si ha accesso alla sostituzione dei processi, soprattutto se si utilizza un sistema operativo recente. Anche sul mio sistema Mac OS X 10.4.11 Tiger (PPC) dove "$BASH_VERSION" è 2.05b.0(1)-releasela sostituzione di processo funziona benissimo.

Ecco come fare utilizzando scriptsu un sistema macOS recente.

Questo dovrebbe funzionare sul sistema macOS 10.11 El Capitan e, stando a quella pagina di manuale, su qualsiasi sistema macOS. almeno fino a macOS 10.9 Mavericks e forse anche prima:

script -q >(./dewtell >>clean.log) brew args...

Che registra tutto ciò che viene scritto nel terminale, compreso il proprio input se viene rievocato cioè se viene visualizzato nel terminale, cosa che di solito avviene. Se si desidera che il proprio input venga registrato anche se non appare, tenendo presente che la situazione in cui ciò si verifica è spesso l'inserimento di una password, allora, come indicato nella risposta, aggiungete l'opzione -k l'opzione:

script -kq >(./dewtell >>clean.log) brew args...

In entrambi i casi, sostituire ./dewtell con il comando che esegue lo script di dewtell o qualsiasi altro programma o script che si desidera utilizzare per filtrare l'output, clean.log con il nome del file in cui si vuole scrivere il dattiloscritto, omettendo le sequenze di escape, e brew args...5 con il comando che si sta eseguendo e i suoi argomenti.

Sovrascrittura o aggiunta al registro

Se si desidera sovrascrivere clean.log invece di aggiungerlo, usare >clean.log invece di >>clean.log. Il file vero e proprio viene scritto dal comando che viene eseguito tramite la sostituzione di processo, quindi l'opzione > o >> appare all'interno di >().

Non tentare di utilizzare >>( al posto di >(che è un errore di sintassi e non ha senso perché l'opzione > in >( per la sostituzione del processo non significa reindirizzamento.

Non passare -a a script con l'intenzione di evitare che il file di log venga sovrascritto in questa situazione, perché questo aprirebbe semplicemente il file la pipe denominata in modalità append - che ha lo stesso effetto di aprirla per una normale scrittura - e poi sovrascrivere o aggiungere clean.log, sempre a seconda che >clean.log o >>clean.log è utilizzato nella sottoguscia.

Allo stesso modo, non utilizzare >& o &> o aggiungere 2>&1 all'interno di >() (o ovunque), perché se ./dewtell genera errori o avvertimenti, si vorrebbe vederli piuttosto che vederli scritti in clean.log. Il parametro script include automaticamente il testo dello standard error nel suo dattiloscritto; non è necessario fare nulla di speciale per ottenere questo risultato.

Su altri sistemi operativi

Come dice la risposta:

[S]Alcune versioni del script hanno una sintassi diversa; quella fornita è per OS X/macOS, quindi è necessario adattarla.

GNU/Linux

La maggior parte dei sistemi GNU/Linux utilizza il comando script fornita da util-linux. Se si vuole far eseguire un comando specifico invece di avviare una shell, è necessario utilizzare l'opzione -c e passare l'intero comando come un singolo argomento della riga di comando a scriptche si può ottenere racchiudendolo tra virgolette. Questo è diverso dalla versione di script sui sistemi macOS recenti come il vostro, che consente di passare il comando naturalmente come argomenti multipli posti dopo il nome del file di output (senza opzioni come -c).

Quindi su Debian, Ubuntu, Fedora, CentOS e sulla maggior parte degli altri sistemi GNU/Linux, si può usare questo comando (se c'è un comando brew comando 6 o sostituendolo con qualsiasi comando si voglia eseguire e registrare l'output trasformato):

script >(./dewtell >>clean.log) -qc 'brew args...'

Come con script sul vostro sistema, su GNU/Linux rimuovete -q se si desidera che script includa più messaggi sull'inizio e la fine della registrazione. Anche con l'opzione -q questa versione di script include ancora una riga in alto che dice quando ha iniziato l'esecuzione, anche se non mostra voi quella riga e non scrive o mostra nulla su quando ha iniziato a funzionare. si è fermato in esecuzione.

Non c'è -k . Viene registrato solo il testo che appare nel terminale.7

FreeBSD

Il script in macOS è nato in FreeBSD. Tutte le versioni supportano -a per aggiungere invece di sovrascrivere (anche se, come notato in precedenza, questo non aiuta ad aggiungere quando si scrive attraverso una named pipe usando la sostituzione di processo). -a era l'unica opzione fino a FreeBSD 2.2.5 incluso. L'opzione -q è stata aggiunta in FreeBSD 2.2.6. L'opzione -k è stata aggiunta in FreeBSD 2.2.7.

Fino a FreeBSD 2.2.5, l'opzione script non permetteva di indicare un comando specifico, ma eseguiva sempre la shell dell'utente, indicata dall'opzione SHELL con il comando /bin/sh come ripiego se la variabile non è impostata. A partire da FreeBSD 2.2.6, era possibile dare un comando specifico sulla riga di comando a script che sarebbe stato eseguito al posto di una shell.

Quindi le versioni successive di FreeBSD, comprese quelle che si incontrano comunemente oggi, sono simili ai sistemi macOS più recenti, come il vostro, nel modo in cui la variabile script può essere invocato. Allo stesso modo, le vecchie versioni di FreeBSD sono simili alle vecchie versioni di macOS (vedi sotto).

Si noti che perl non fa parte del sistema di base di FreeBSD in nessuna versione recente e bash non lo è mai stato. Entrambi possono essere facilmente installati usando i pacchetti (come con pkg install perl5 bash bash-completion) o le porte. Il sistema fornisce /bin/sh in FreeBSD non supporta la sostituzione dei processi.

Le vecchie versioni di macOS e qualsiasi altro sistema con un sistema meno versatile di script

Ho effettuato il test su Mac OS X 10.4 Tiger dove script accetta solo il -a è un'opzione. Non accetta -q o -k. Include nel suo dattiloscritto solo le sequenze di tasti mostrate nel terminale 7, come nella versione util-linux su sistemi GNU/Linux.

Almeno fino a quando non riuscirò a trovare una fonte affidabile di documentazione per script in ogni versione di macOS (per quanto ne so, solo le manpages di 10.9 Mavericks sono prontamente disponibili online), raccomando agli utenti di macOS di eseguire man script per verificare la sintassi del loro script accetta, come si comporta di default e quali opzioni supporta. Si consiglia di usare questi comandi su una vecchia versione di macOS come la mia:

script >(./dewtell >>clean.log)
brew args...
exit

Questo vale anche per scriptsu qualsiasi altro sistema operativo in cui non supporta molte opzioni o su sistemi operativi in cui le altre opzioni sono supportate ma si preferisce non usarle. Questo metodo di utilizzo di script per avviare una shell, eseguire il comando o i comandi della shell che si desidera registrare e quindi uscire dalla shell, è il metodo tradizionale.

Il brutto trucco di fingere che il proprio comando sia la propria shell

Se proprio si deve usare script per eseguire un singolo comando piuttosto che una nuova istanza della vostra shell, c'è un brutto trucco che potete usare a volte: potete fargli credere che il comando che volete eseguire sia in realtà la vostra shell con SHELL=your-command script outfile. Prima di farlo, però, dovreste pensarci due volte, perché se il comando your-command consulta effettivamente il file SHELL per verificare quale sia la shell effettivamente utilizzata, ilarità un comportamento sfortunato.

Inoltre, questo non funzionerà facilmente per un comando composto da più parole, cioè un comando a cui si passano uno o più argomenti. Se si scrive SHELL='brew args...' prima di script sulla stessa riga, si riuscirebbe a passare il comando brew args... in scriptnell'ambiente di script come valore di SHELLma l'intera stringa verrebbe usata come nome del comando, anziché solo la prima parola, e non verrebbe passato alcun argomento al comando, anziché tutte le altre parole.

Si può ovviare a questo problema scrivendo uno script di shell, chiamato run-brew o come lo si voglia chiamare, che esegua brew con args... e poi lo passa come valore del parametro SHELL della variabile d'ambiente. Dopo aver creato la variabile d'ambiente run-brew l'esecuzione dello script di shell tramite la variabile d'ambiente script potrebbe apparire come segue:

SHELL=run-brew script >(./dewtell >>clean.log)

Per le ragioni sopra esposte, sconsiglio di utilizzare il metodo di assegnare il nome del comando a SHELLa meno che l'azione che si sta eseguendo non sia importante o si sia sicuri che non comporterà l'uso di SHELL. Poiché Homebrew esegue numerose azioni piuttosto complicate, suggerisco di non eseguire effettivamente un comando run-brew come questo. (Non c'è niente di male nel mettere il vostro lungo e complicato script brew in un comando run-brew ma solo nell'usare SHELL=run-brew per creare script eseguirlo).

Ho trovato questo metodo un po' utile quando ho testato le tecniche mostrate sopra con un semplice programma al posto di brew args..., tuttavia.

Prova e dimostrazione della tecnica

Potreste trovare utile provare alcuni di questi metodi su un comando meno complicato del vostro lungo brew lungo. Io l'ho fatto.

Il programma demo / generatore di input di prova e il metodo di test utilizzato

Ho creato questo semplice script Perl interattivo che scrive sullo standard error, chiede all'utente sullo standard output il suo nome, lo legge dallo standard input, quindi scrive un saluto sullo standard output con il nome dell'utente a colori:

#!/usr/bin/perl

use strict;
use warnings;
use Term::ANSIColor;

print STDERR $0, ": warning: this program is boringn";
print "What's your name?  ";
chomp(my $name = );
printf "Hello, %s!n", colored($name, 'cyan');

L'ho chiamato colorhi e l'ho messo nella stessa directory dello script di dewtell, che ho chiamato dewtell.

Nei miei test ho sostituito #!/usr/bin/perl con #!/usr/bin/env perl in entrambi gli script.8 Ho effettuato il test su Ubuntu 16.04 LTS con il perl 5.22.1 fornito dal sistema e le versioni 5.6.2 e 5.8.9 fornite da perlbrew; FreeBSD 11.1-RELEASE-p3 con il file pkg-con il perl 5.24.3 e le versioni 5.6.2, 5.8.9 e 5.27.5 fornite da perlbrew; e Mac OS X 10.4.11 Tiger con il perl 5.8.6 fornito dal sistema e le versioni 5.6.2, 5.8.9 e 5.27.5 fornite da perlbrew.

Ho ripetuto i test descritti di seguito con ognuna di queste versioni di perl, testando prima il perl fornito dal sistema 9 e poi utilizzando la versione perlbrew use per causare temporaneamente ogni versione perlbrew-fornito perl appaia per primo in $PATH (ad esempio, per testare perl 5.6.2, ho eseguito perlbrew use 5.6.2e poi i comandi mostrati di seguito per il sistema su cui stavo effettuando il test).

Un amico lo ha testato su macOS 10.11.6 El Capitan, con le linee di hashbang originali, facendo usare il perl 5.18.2 fornito dal sistema e non testando altri interpreti. Questo test ha utilizzato gli stessi comandi che ho eseguito su FreeBSD.

Tutti i test hanno avuto successo tranne che con il perl fornito dal sistema in Mac OS X 10.4.11 Tiger che ha fallito a causa di quello che sembra essere uno strano bug che coinvolge le classi di caratteri nelle espressioni regolari, come ho descritto in precedenza in dettaglio e come mostrato di seguito in un esempio.

Su Ubuntu

Mentre mi trovavo nella directory che conteneva gli script, ho eseguito questi comandi sul sistema Ubuntu per produrre un dattiloscritto con sequenze di escape e qualsiasi carattere di backspace che avrei potuto digitare:

printf 'Whatever header you want...nn' >dirty.log
script dirty.log -aqc ./colorhi

Ho digitato Eliah, poi mi sono comportato come se ci avessi ripensato, cancellandolo con gli spazi indietro e digitando Bob from accounting al suo posto. Poi ho premuto Invio e sono stato accolto a colori. Poi ho eseguito questi comandi separatamente produrre un dattiloscritto senza sequenze di escape e senza alcun segno del mio vero nome, interagendo con esso esattamente nello stesso modo (compresa la digitazione e la cancellazione Eliah):

printf 'Whatever header you want...nn' >clean.log
script >(./dewtell >>clean.log) -qc ./colorhi

vim visualizza i caratteri di controllo in modo simbolico come cat -v e offre il vantaggio di un testo illuminato o colorato. Questo è ciò che il buffer mostrato da view dirty.log ma con le rappresentazioni dei caratteri di controllo in corsivo per farle risaltare:

Whatever header you want...

Script started on Thu 09 Nov 2017 07:17:19 AM EST
./colorhi: warning: this program is boring^M
What's your name?  Eliah^H ^H^H ^H^H ^H^H ^H^H ^HBob from accounting^M
Hello, ^[[36mBob from accounting^[[0m!^M

E questo è l'aspetto del buffer per view clean.log:

Whatever header you want...

Script started on Thu 09 Nov 2017 07:18:31 AM EST
./colorhi: warning: this program is boring
What's your name?  Bob from accounting
Hello, Bob from accounting!

I risultati sono stati gli stessi con ogni interprete testato, tranne ovviamente per il timestamp.

Su FreeBSD (e macOS 10.11.6 El Capitan)

Su FreeBSD ho eseguito il test nello stesso modo in cui l'ho eseguito su Ubuntu, tranne per il fatto che ho utilizzato questi comandi per produrre dirty.log:

printf 'Whatever header you want...nn' >dirty.log
script -aq dirty.log ./colorhi

E ho usato questi comandi per produrre clean.log:

printf 'Whatever header you want...nn' >clean.log
script -q >(./dewtell >>clean.log) ./colorhi

Questi sono gli stessi comandi che il mio amico ha eseguito per testare questo su macOS 10.11 e anche se l'input emesso era leggermente diverso dal mio Eliah/Bob from accounting un nome veniva comunque digitato, cancellato con degli spazi e sostituito da un altro nome. L'output era quindi simile, tranne che per i nomi e il numero di backspace.

Con tutte e quattro le implementazioni di Perl testate su FreeBSD e con l'unica implementazione (fornita dal sistema) su macOS 10.11, entrambi i metodi dirty.log e clean.log ha mostrato l'output previsto. Confrontando i risultati di FreeBSD con quelli di Ubuntu, la differenza è stata l'assenza di timestamp, dovuta a -q. Tutte le sequenze di escape e i ritorni a capo sono stati rimossi con successo in clean.log, così come tutti i backspace e i caratteri la cui cancellazione era indicata dai backspace.

Su Mac OS X 10.4.11 Tiger

Ho eseguito il test allo stesso modo sul mio vecchio sistema Tiger e su Ubuntu e FreeBSD, tranne per il fatto che ho usato questi comandi per produrre dirty.log:

printf 'Whatever header you want...nn' >dirty.log
SHELL=colorhi script -a dirty.log

E ho usato questi comandi per produrre clean.log:

printf 'Whatever header you want...nn' >clean.log
SHELL=colorhi script >(./dewtell >>clean.log)

Poiché il sistema script non supporta il comando -qi risultati includono sia (a) a Script started aggiunta dopo l'intestazione e (b) una linea nuova seguita da una linea Script done aggiunta alla fine di ogni dattiloscritto. Entrambe le righe contenevano i timestamp. Oltre a questo, i risultati sono stati gli stessi di Ubuntu e FreeBSD, tranne che per il fatto che le sequenze di escape per passare da e verso il testo ciano non sono state completamente rimosse con la funzione di sistema perl. La riga pertinente di dirty.log è sempre apparsa in questo modo in vim, come previsto:

Hello, ^[[36mBob from accounting^[[0m!^M

Con il perl 5.8.6 fornito dal sistema, questa era la riga corrispondente in clean.logche mostra 6m e 0m, che avrebbero dovuto essere rimossi, rimasti:

Hello, 6mBob from accounting0m!

Con ciascuno degli elementi perlbrew-installati, tutte le sequenze di escape sono state completamente e correttamente rimosse, e quella riga in clean.log si presentava così, proprio come con tutti gli interpreti Perl che ho utilizzato su Ubuntu e FreeBSD:

Hello, Bob from accounting!

Note

1 Questo manuale è per Bash 2. Molti utenti di Bash hanno la versione 4 e preferiscono leggere la sostituzione dei processi, le pipeline e altri argomenti nel manuale di Bash attuale. Le versioni attuali di macOS vengono fornite con Bash 3.

2 L'errore standard è quasi sempre non bufferizzato, indipendentemente dal tipo di file o dispositivo. Non esiste una regola per cui i programmi non possono bufferizzare le scritture sul descrittore di file 2, ma c'è una forte tradizione a non farlo, basata sulla necessità di vedere effettivamente i messaggi di errore e di avvertimento quando si verificano, e anche sulla necessità di vederli. in ogni momento anche se il programma termina in modo anomalo senza aver mai chiuso correttamente o comunque svuotato i descrittori di file aperti. Di solito sarebbe un bug per un programma bufferizzare le scritture sullo standard error per impostazione predefinita.

3 La sostituzione del processo utilizza un denominata pipe, chiamata anche FIFO, che raggiunge lo stesso obiettivo generale dell'operatore pipe | in shell, ma è più versatile. Tuttavia, anche se questo sia una pipe, ritengo che non sia una conduttura, che considero riferita allo specifico costrutto sintattico e al corrispondente comportamento di una shell.

4 Se si considera una pipe denominata come un file, cosa che si dovrebbe fare, allora questo è letteralmente ciò che accade.

5 Anche se "$COMMAND" appare nella vostra risposta e passa un intero comando come singolo argomento a script (perché le doppie virgolette sopprimono la divisione delle parole), siete stati in grado di passare il comando a script come argomento multiplo.

6 Come nel caso di Linuxbrew, che devo riconoscere mi ha fatto conoscere.

7 Tuttavia, raccomando a chiunque faccia affidamento su questo comportamento per mantenere segreti i dati sensibili di testare il comportamento del proprio scripte magari anche di ispezionare i dattiloscritti generati per assicurarsi che non siano presenti dati che devono essere protetti. Per essere ancora più sicuri, utilizzare un editor che mostri i caratteri che normalmente sarebbero nascosti sullo schermo, oppure utilizzare il comando cat -v.

8 Le versioni con #!/usr/bin/perl, compresa la versione colorhi dovrebbero funzionare e fare la cosa giusta sulla maggior parte dei sistemi. Ho usato #!/usr/bin/env perl nei miei test. Ma il mio amico che ha lo stesso sistema operativo di voi (il poster originale) ha usato #!/usr/bin/perl. In questo modo si è raggiunto l'obiettivo di verificare, con la minima complicazione o potenziale dubbio, che il perl fornito dal sistema funzionasse.

9 Su FreeBSD non esiste un perl fornito dal sistema in senso stretto. Ho testato la versione installata tramite pkg prima.

Ti mostriamo le recensioni e le valutazioni degli utenti

Ricorda che hai la possibilità di aggiungere una recensione se hai trovato il tuo puzzle al momento giusto.



Utilizzate il nostro motore di ricerca

Ricerca
Generic filters

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.