在fish shell脚本中,' - *'作为case参数是什么意思?

时间:2016-09-18 09:48:26

标签: shell fish

鱼壳的官方文件有this example

function mkdir -d "Create a directory and set CWD"
    command mkdir $argv
    if test $status = 0
        switch $argv[(count $argv)]
            case '-*'

            case '*'
                cd $argv[(count $argv)]
                return
        end
    end
end

我理解case '*'与C ++ switch语句中的default:类似。

case '-*'的含义或用法是什么?

2 个答案:

答案 0 :(得分:3)

这是一场全球比赛。

只要切换参数以&#34; - &#34;开始执行,就会执行<case '-*'

因为只使用第一个匹配的案例,case '*'作为最后一个案例就像&#34;默认:&#34;。如果你之前有过它,它会吞下它之后的所有情况。

此处的引号也是必要的,因为否则fish会扩展glob,这意味着case -*会将当前目录中所有匹配的文件名作为参数,所以如果切换参数是名称,则为真当前目录中以&#34; - &#34;。

开头的文件

答案 1 :(得分:2)

@faho's answer的帮助下,我理解-*的目的。

-*是glob模式。它与*.pdfReport_2016_*等模式完全不同。

作者添加了此项检查以忽略以-开头的所有目录。它将创建一个以-开头的目录,但不会将CWD设置为它。

原因是-在shell中有特殊用法。

例如,cd -不会将目录更改为名为-的目录。相反,它会切换到您所在的最后一个目录。

名称以-开头的目录或文件是麻烦的来源。关于SO姐妹网站的以下问题提出了一个想法。

  1. How do you enter a directory that's name is only a minus?

  2. How do I delete a file whose name begins with “-” (hyphen a.k.a. dash or minus)?

  3. How to cd into a directory with this name “-2” (starting with the hyphen)?
  4. 难怪作者决定忽略以-开头的目录。