如何在fish-shell中定义一个argv不在命令末尾的函数

时间:2014-09-25 05:00:55

标签: shell fish

如果我想为

做一个find的简称

find dir_name -type d

fd

然后我可以使用fd dir_name来执行命令。

如何定义function或制作alias来解决问题

如果我能做到这一点会更好:fd dir-name other_operations等于

在终端

find dir_name -type d other_operations

fish-shell内置文档没有关于此的信息。

3 个答案:

答案 0 :(得分:3)

您可以定义一个类似的函数:

function fd
    find $argv -type d
end

函数的参数在$argv列表中传递。在传递它们之前,您可以自由切片和切块。

答案 1 :(得分:2)

好吧,如果fish适度地跟随POSIX shell,那么诸如其中之一的函数可能会起到作用。

fd() {
    find "$@" -type d
}

或者:

fd() {
    dir="$1"
    shift
    find "$dir" -type d "$@"
}

第一个假设所有参数都是可以在-type d之前的目录或操作数。第二个假设有一个目录,然后是其他参数。

除了符号的详细信息之外,您可能可以在fish中实现类似的内容。


当然,如果您转到http://fishshell.com/,特别是有关如何创建function的文档,您会发现语法的相似性有限。

function fd
    find $argv -type d
end

function fd
    find $argv[1] -type d $argv[2..-1]
end

最后一个函数仅在至少有2个参数传递给函数时才有效。 “好奇;其他不存在的变量扩展为空,但不是像这样的数组扩展。有一个(内置)命令count可用于确定数组中有多少元素:count $argv将返回数组中元素的数量。

因此修订后的代码版本为:

function fd
    if test (count $argv) -gt 1
        find $argv[1] -type d $argv[2..-1]
    else
        find $argv[1] -type d
    end
end

答案 2 :(得分:0)

感谢@Jonathan Leffler,这不可能没有他的帮助:


至于他的答案,$argv[2..-1](或$argv[2...-1])的最后一部分是不对的,似乎fish-shell不支持这种语法,它说:

Could not expand string “$argv[2..-1]

实际上经过几次测试后发现该部分是不必要的,如果fish-shell是一个列表,$argv会自动解析$argv的其余部分。

<小时/>

正确的模板(已经过测试,如此简单):

function fd --description 'List all the (sub)directory names in a direction'
    find $argv[1] -type d
end