如果我想为
做一个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内置文档没有关于此的信息。
答案 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)
至于他的答案,$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