我正在使用m4创建一些基本的宏,我意识到当使用esyscmd
时,在命令运行时会在字符串中添加一个尾随的新行。
示例:
define(MY_HOSTNAME, esyscmd(`hostname'))
MY_HOSTNAME
Some other text...
渲染:
> my.host.name
>
> Some other text...
(完成一个尾随的新行)
通过在define(或esyscmd)的末尾添加dnl
,似乎没有任何事情发生,并且仍然有一个尾随换行符。
在m4中调用esyscmd
时删除尾随换行符的最佳方法是什么?
答案 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