在鱼壳中的命令中使用存储在一个变量中的多个参数

Jos*_*dal 2 fish

我想在鱼壳脚本中将存储在变量中的一堆参数传递给内置命令。例如,像这样:

set params "-h -d 1"
du $params
Run Code Online (Sandbox Code Playgroud)

我希望以上内容等同于

du -h -d 1    
Run Code Online (Sandbox Code Playgroud)

但是,事实并非如此。结果为错误:“ du:非法选项-”

如果我只是设置params-h或设置为,-d 1但不能同时设置两者,则它确实可以工作。

我发现的一种解决方法是

eval du $params
Run Code Online (Sandbox Code Playgroud)

但这似乎...错误,过度。有没有更清洁的方法?

fah*_*aho 5

只需删除引号。

之所以在POSIX shell(如bash)中起作用,是因为“ 单词拆分 ”。使用无引号的变量时,将替换该值,然后将其沿IFS变量中的字符(通常为制表符,换行符和空格)分割。

在鱼中,首先使用数组将元素分开。碰巧的是,唯一需要做的更改就是删除引号:

set params -h -d 1
du $params
Run Code Online (Sandbox Code Playgroud)

  • Fish_确实_对命令替换执行拆分(但不执行变量扩展),但仅对换行符执行拆分。因此,要么明确地分割它(例如 `(string split " " < /tmp/p)`),要么更改文件以使用换行符 - 这也适用于 POSIX shell,因为它们也按换行符分割。 (2认同)