2013-12-18 11 views
8

Sto utilizzando m4 per creare alcuni macro di base e mi rendo conto che quando si utilizza esyscmd c'è una nuova riga finale aggiunta a una stringa quando viene eseguito il comando.Rimuovi newline finale da esyscmd in m4

Esempio:

define(MY_HOSTNAME, esyscmd(`hostname')) 
MY_HOSTNAME 
Some other text... 

Renders:

> my.host.name 
> 
> Some other text... 

(completo di una nuova linea di trascinamento)

Aggiungendo dnl alla fine della define (o esyscmd) nulla sembra capita e c'è ancora una nuova riga finale.

Qual è il modo migliore per rilasciare il newline finale quando si chiama esyscmd in m4?

+2

Hm, dalla shell dovrei 'echo -n \' hostname \ '' ... – Wrikken

+0

@Wrikken vorrei inviare il tuo commento come risposta. è perfettamente valido e una buona alternativa ai devnulls – ldgorman

risposta

3

* i sistemi nix hanno tr per impostazione predefinita. Usalo:

define(MY_HOSTNAME, esyscmd(sh -c "hostname | tr -d '\n'")) 

e ti libererai della nuova riga finale!

1

Un'alternativa sarebbe

echo -n `hostname` 

No tubo, ma backticks, whatevers adatta la vostra fantasia.

3

L'esempio di devnull è buono ma, M4 ha anche un tr integrato. Ecco cosa sto facendo:

define(CMD_OUTPUT, esyscmd(`sass --style=compressed foo.sass')) 
define(NL,` 
') 
translit(CMD_OUTPUT, NL) 

Qualcuno un po 'meglio con M4 potrebbe stringere quello in una singola macro.