shell Fish命令替代参数-- eval安全吗?

y1aodyip  于 2023-10-23  发布在  Shell
关注(0)|答案(2)|浏览(157)

在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中轻松地做到这一点。
谢谢你,谢谢

7kjnsjlb

7kjnsjlb1#

这在fish文档的FAQ部分有明确的说明,以pkg-config为例:
与其他shell不同的是,fish只在换行符上分割命令替换,而不是空格、制表符或$IFS中的字符。
但是有时候,特别是使用pkg-config和相关工具时,需要对空格进行分割。
在这些情况下,使用字符串split -n““like:

g++ example_01.cpp (pkg-config --cflags --libs gtk+-2.0 | string split -n " ")

所以你的命令变成:

gcc basic-tutorial-1.c -o basic-tutorial-1 $(pkg-config --cflags --libs gstreamer-1.0 | string split -n " ")

以这种方式使用eval真的能始终如一地实现我想要的功能吗?
当然不是。如果你的命令打印的东西看起来像任何类型的扩展,它将被执行。
如果它打印,例如。一个*或者一个$或者一个()它会运行实际的扩展。在您的特定情况下,路径包含任何这些字符都不是不可能的。

ax6ht2ek

ax6ht2ek2#

set var '-l -h'
set var_array (string split ' ' -- "$var")
ls $var_array

相关问题