从m4中删除esyscmd中的尾随换行符

时间:2013-12-18 01:34:03

标签: bash shell m4

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

示例:

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

渲染:

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

(完成一个尾随的新行)

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

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

4 个答案:

答案 0 :(得分:5)

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

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

M4稍微好一些的人可以把它变成一个宏。

答案 1 :(得分:3)

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

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

你就可以摆脱尾随换行了!

答案 2 :(得分:2)

另一种选择是

echo -n `hostname`

没有管道,但是反叛,whatevers适合你的想象。

答案 3 :(得分:0)

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

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

foo MY_HOSTNAME bar  # -> foo Dans-Macbook-Pro.local bar
相关问题