如何在fish shell脚本中使用命令行参数

dop*_*man 2 shell fish

我正在尝试为别名写一个别名grep:

# config.fish
alias grepcustom="grep -r $argv ~/"
Run Code Online (Sandbox Code Playgroud)

基本上我想要做的是在我的主目录上的递归grep,而不必输出任何东西(我知道我很懒).

当我重新启动shell并运行时,grepcustom我得到:

$ grepcustom "hello"
grep: hello: No such file or directory
Run Code Online (Sandbox Code Playgroud)

有一个文件包含"你好".如果我grep -r在shell中运行它可以正常工作.但是,问题似乎在于我的别名如何识别命令行参数"hello".我究竟做错了什么?

gle*_*man 7

你需要编写一个实际的函数:

$ alias grepcustom="grep -r $argv ~/"
$ type grepcustom
grepcustom is a function with definition
function grepcustom
    grep -r  ~/ $argv;
end
Run Code Online (Sandbox Code Playgroud)

那里发生了什么?由于我没有$argv在我的shell中定义,它被一个空字符串替换,然后alias添加$ argv以使该函数工作.让我们试试单引号:

$ alias grepcustom='grep -r $argv ~/'
$ type grepcustom
grepcustom is a function with definition
function grepcustom
    grep -r $argv ~/ $argv;
end
Run Code Online (Sandbox Code Playgroud)

那显然不对.你要

function grepcustom -a pattern
    grep -r $pattern ~/
end
Run Code Online (Sandbox Code Playgroud)

  • [function`命令]的`-a`选项(http://fishshell.com/docs/current/commands.html#function)允许您命名函数参数.`$ argv`出现两次因为'alias foo = bar`创建了这个:`function foo; bar $ argv; 结束` - 即[$ argv明确添加](http://fishshell.com/docs/current/commands.html#alias),无论是什么`bar`. (3认同)