通配符作为shell参数

时间:2018-05-21 09:09:42

标签: linux shell ls

我知道正则表达式和通配符一般如何工作,但我真的不明白为什么你可以将它们用作参数。

ls /[!\(][!\(][!\(]/

命令导致以下输出

...
com.apple.launchd.AIPZ6SAfpO
com.apple.launchd.HarlOx3LWS
com.apple.launchd.VmTi5KDz1h
powerlog

/usr/:
X11     include     libexec     sbin        standalone
bin     lib     local       share

/var/:
agentx      empty       log     netboot     rwho
at      folders     ma      networkd    spool
audit       install     mail        root        tmp
backups     jabberd     msgs        rpc     vm
db      lib     mysql       run     yp

根据我的理解,这应该匹配不包含斜杠/[!\(][!\(][!\(]/

的每三个字符文件夹名称

但为什么我可以将它用作参数?

3 个答案:

答案 0 :(得分:2)

您不能将正则表达式用作参数(或者更确切地说,当放置在参数中时,shell不会将字符串视为正则表达式)。 unquoted glob /[!\(][!\(][!\(]/按顺序匹配:

  1. 斜线。
  2. 三个不是开头括号的字符。
  3. 斜线。
  4. 换句话说,三个字母的根目录在任何地方都不包含(

    shell globs扩展为零(例如,在Bash的nullglob的情况下)或更多可传递给execve的参数,如以下命令所示:

    $ strace -fe execve echo *
    execve("/usr/bin/echo", ["echo", "directory1", "directory2"], 0x7ffcff705ce8 /* 44 vars */) = 0
    

答案 1 :(得分:0)

不,你不知道......在for (var k = 0; k < data1.queryA.length; k++) { data.addColumn('number', data1.queryA[k].keyword); } for (var i = 0; i < data1.query.length; i++) { var arr = []; alert(data1.query[i].date.length); for (var j = 0; j < data1.query[i].date.length; j++) { arr.push(parseInt(data1.query[i].date[j].page)); } var test = [new Date(data1.query[i].datee)]; console.log(test.concat(arr)); data.addRow(test.concat(arr)); } 中描述了shell模式,而glob(3)中描述了正则表达式(更详细的概念)用于类似目的的两个不同的库。在替换参数时,regex(3)不使用正则表达式。它只使用sh(1)库。

答案 2 :(得分:-1)

因为那是shell的工作方式。包含(未引用的)glob字符/表达式的任何参数都将扩展为文件名。发生了什么,比如rm *.txt(因为*是一个水球角色),ls /[!\(][!\(][!\(]/中发生了什么(因为[abc]是一个glob表达式。)

但是,他们并不是正则表达式。参见例如https://mywiki.wooledge.org/glob用于语法。