12

我正在使用 m4 创建一些基本的宏,并且我意识到在esyscmd运行命令时会在字符串中添加一个尾随新行。

例子:

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

渲染:

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

(带有尾随的新行)

通过dnl在定义(或 esyscmd)的末尾添加,似乎没有发生任何事情,并且仍然有一个尾随换行符。

esyscmd调用m4时删除尾随换行符的最佳方法是什么?

4

4 回答 4

5

devnull 的例子很好,但是 M4 也有一个内置函数tr。这就是我正在做的事情:

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

使用 M4 稍微好一点的人可以将其收紧到一个宏中。

于 2014-03-22T16:29:59.973 回答
3

*nix 系统tr默认有。利用它:

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

你会摆脱尾随的换行符!

于 2013-12-18T08:16:55.897 回答
2

另一种选择是

echo -n `hostname`

没有管道,但反引号,任何适合你的幻想。

于 2014-03-18T11:13:23.750 回答
1

您可以使用translit宏。如果没有传递第三个参数,则从第一个参数中删除第二个参数中传递的字符列表。所以在你的情况下,你的第一个参数translitesyscmd(`hostname'),第二个参数是换行符,你不会传递第三个参数。注意:下面的文字换行符导致宏定义位于两行:

define(`MY_HOSTNAME', translit(esyscmd(`hostname'), `
'))dnl

foo MY_HOSTNAME bar  # -> foo Dans-Macbook-Pro.local bar
于 2019-04-12T08:47:08.843 回答