2013-12-18 7 views
8

Ich benutze M4, um einige grundlegende Makros zu erstellen, und ich stelle fest, dass bei der Verwendung esyscmd eine abschließende neue Zeile zu einer Zeichenfolge hinzugefügt wird, wenn der Befehl ausgeführt wird.Entfernen Sie die nachfolgende Zeilenumbruch von esyscmd in M4

Beispiel:

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

Renders:

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

(komplett mit einer Hinter neue Zeile)

Durch Zugabe von dnl am Ende der Definition (oder esyscmd) nichts scheint passieren und es gibt immer noch eine abschließende Zeilenumbruch.

Was ist der beste Weg, um die abschließende Newline beim Aufruf esyscmd in M4 fallen lassen?

+2

Hm, von der Shell würde ich 'echo -n \' hostname \ "... – Wrikken

+0

@Wrikken würde ich Ihren Kommentar als Antwort senden. Es ist absolut gültig und eine gute Alternative zu Devin – ldgorman

Antwort

3

* Standardmäßig haben nix systems tr. Verwenden Sie das:

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

und Sie würden die nachlaufende Newline loswerden!

1

Eine alternative

echo -n `hostname` 

Kein Rohr, aber Backticks sein würde, passt Was immer Sie Lust haben.

3

devnulls Beispiel ist gut, aber M4 hat auch tr eingebaut. Hier ist, was ich tue:

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

Jemand ein wenig besser mit M4 könnte das in einem einzigen Makro zu straffen.