在fish shell中,我希望能够将命令替换或变量扩展为另一个命令的多个参数,例如:
在无取代的情况
ls -l -h
给予的结果应与:
ls $(echo '-l -h')
相反,第二个给出了一个错误:
ls: invalid option -- ' '
如果我这样做:
eval ls $(echo '-l -h')
它做了我想要的,它似乎。
两个问题:
1.以这种方式使用eval真的能始终如一地实现我想要的功能吗?
1.有没有别的办法让我来做这个?
我读了这个问题和答案,这与我的非常相似:Command substitution in fish
但答案不适用于我的情况。
我拥有的真实的世界用例是遵循gstreamer的说明:https://gstreamer.freedesktop.org/documentation/installing/on-linux.html?gi-language=c#
它说要用以下内容构建教程:
gcc basic-tutorial-1.c -o basic-tutorial-1 `pkg-config --cflags --libs gstreamer-1.0`
当然,这在鱼身上不起作用(因为反作用)。但是当转换为$()语法时,它会出现以下错误:
gcc: error: unrecognized command-line option ‘-pthread -I/usr/include/gstreamer-1.0 -I/ ....
因为它将$()块的输出解释为一个字符串--这是有意义的,看起来也是合理的,只是它阻塞了这个非常合理的(imo)用例,我希望能够在fish中轻松地做到这一点。
谢谢你,谢谢
2条答案
按热度按时间7kjnsjlb1#
这在fish文档的FAQ部分有明确的说明,以pkg-config为例:
与其他shell不同的是,fish只在换行符上分割命令替换,而不是空格、制表符或$IFS中的字符。
但是有时候,特别是使用pkg-config和相关工具时,需要对空格进行分割。
在这些情况下,使用字符串split -n““like:
所以你的命令变成:
以这种方式使用eval真的能始终如一地实现我想要的功能吗?
当然不是。如果你的命令打印的东西看起来像任何类型的扩展,它将被执行。
如果它打印,例如。一个
*
或者一个$
或者一个()
它会运行实际的扩展。在您的特定情况下,路径包含任何这些字符都不是不可能的。ax6ht2ek2#