2015-06-07 13 views
6

Sto tentando di richiedere l'input dell'utente, ma ho problemi a ottenere il prompt read -p che viene stampato come previsto quando viene eseguito da un Makefile o una subshell avviata da un Makefile. Qui sono i miei tentativi di raggiungere questo senza successo:non viene stampato correttamente quando viene eseguito in Makefile

test1: 
    @echo '>> before input <<'; \ 
     read -p 'type something:' FOO; \ 
     echo '>> after input <<'; \ 
     echo $$FOO 

L'output è simile al seguente supponendo che in ingresso asdf. Il mio ingresso viene stampato mentre sto scrivendo, ma la richiesta type something: viene stampato dopo tutto il resto:

$ make 
>> before input << 
asdf 
>> after input << 
asdf 
type something 

Un altro modo in cui ho provato sta utilizzando l'interfaccia readline di Bash read -e:

test2: 
    @echo '>> before input <<'; \ 
     read -e -p 'type something:' FOO; \ 
     echo '>> after input <<'; \ 
     echo $$FOO 

In questo caso l'uscita sembra buono, tuttavia, né il prompt type something: né l'input effettivo durante la digitazione vengono stampati fino a dopo aver premuto ENTER, il che è piuttosto scomodo quando si richiede l'input.

Ho anche provato a stampare il prompt prima con echo:

test3: 
    @echo '>> before input <<'; \ 
     echo 'input something:';\ 
     read FOO; \ 
     echo '>> after input <<'; \ 
     echo $$FOO;\ 

E il mio output è quasi buona, ma l'ingresso è stampato su una nuova riga:

$ make 
>> before input << 
input something: 
asdf 
>> after input << 
asdf 

Un ritocco finale utilizzando printf a evitare la nuova riga:

test4: 
    @echo '>> before input <<'; \ 
     printf 'input something: ';\ 
     read FOO; \ 
     printf '\n'; \ 
     echo '>> after input <<'; \ 
     echo $$FOO;\ 

E sembra read corrode la richiesta, se non si conclude con \n:

$ make 
>> before input << 
asdf 
input something: 
>> after input << 
asdf 

E, naturalmente, lo stesso succede se semplicemente chiamare uno script:

test5: 
    ./script.sh 

In caso aiuta individuazione della problema: OS X 10.10.3/make 3.81/bash 3.2.57 (1).

Disclaimer: So che non è una buona idea avere Makefile dipendenti dall'input dell'utente, ma ho bisogno di questo per un caso molto particolare.

+0

Prima di tutto, si desidera questo comportamento per target Makefile, a quanto ho capito, non a livello globale per Makefile. –

+1

Ho provato a eseguire test1 sul mio Mac, che ha le stesse versioni delle applicazioni utilizzate. L'output che ottengo è: 'bash-3.2 $ rendono test1 >> prima dell'ingresso << Scrivi qualcosa: TEST >> dopo ingresso << TESTING' Il che mi porta a credere che abbiamo bisogno di più informazioni per risolvere il problema. Hai apportato modifiche al comportamento di bash o make? – Ashlaban

+0

Penso che tu sia su qualcosa qui, @Ashlaban. Commentando il mio '.zshrc', la lettura si comporta come previsto in tutti i casi. Indagherò su quello che ho dentro che sta causando questo strano problema. – OmeGak

risposta

0

Dal momento che apparentemente nessuno poteva riprodurre il mio problema, ho pensato che dovevo avere qualcosa in corso sul mio ambiente provocandolo. Alla fine ho scoperto che la causa era in agguato da qualche parte sul mio mucchio di tweaks all'interno di .zshrc.

La riga all'origine risulta essere un alias make per l'aggiunta di colorazione con grc che modifica in qualche modo il comportamento di read come effetto collaterale.

alias make='grc make' 

rimuoverlo risolve tutti i problemi, ma, alla fine, la mia soluzione è quella di mantenere l'alias per colorazione in circostanze normali e semplicemente richiamare command make quando è richiesto l'input dell'utente.

+1

Il modo per ignorare l'alias è' comando make' o '\ make'. Senza offesa, ma '/ usr/bin/env make' è semplicemente ridicolo. – 4ae1e1

0

Per test 3 è possibile utilizzare echo -n per stampare il messaggio sulla stessa linea senza la finale \n

+0

Non sembra funzionare. Stampa: '-n input qualcosa:' – OmeGak

+0

L'aggiunta di '-n' a' echo' funziona bene per me in 'test3' –

0

Nei tuoi esempi, si esegue in pratica un unico comando di shell. È possibile eseguire una serie di comandi e penso che sia quello che vuoi qui. Ad esempio, prova questo. Metti nel tuo Makefile:

test1: 
    @echo '>> before input <<' 
    read -p 'type something: ' FOO; \ 
    echo '>> after input <<'; \ 
    echo $$FOO 

Nota che la mancanza di un punto e virgola e backslash sulla prima @echo.

Problemi correlati