V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
AndyAO
V2EX  ›  Linux

在 Linux Bash 中普通的 glob 只能用于路径名吗?

  •  1
     
  •   AndyAO · May 25, 2021 · 1585 views
    This topic created in 1806 days ago, the information mentioned may be changed or developed.

    我在使用 Bash 之前一直在使用 PowerShell,在 PowerShell 上通配符可以用于很多很多的命令。

    但是 Bash 上的通配符好像不是这样,目前看到的所有资料好像都是在将 glob 用于路径名。

    而且 echo * 居然会直接显示当前目录下的所有内容,给人的感觉就是所有的字符串只要有*,好像都会首先被解释为路径通配符。

    在 bash 中 glob 只能用于路径吗?

    如果不是的话,那还用于什么场合呢?

    注意:这里指的是普通的 glob,而非 extglob,我知道后者能用于条件表达式的=和!=

    Supplement 1  ·  May 26, 2021

    搞清楚了

    1. glob在shell内部只能用于「路径扩展」、「Case」和「条件表达式」(默认extglob)
    2. 路径扩展只在非字符数字面量的情况下有用,对任何命令都有用
    3. 其他非shell内部的命令有些也支持glob,不过那和shell本身没关系
    6 replies    2021-05-26 11:27:24 +08:00
    codehz
        1
    codehz  
       May 25, 2021 via Android   ❤️ 1
    Linux 的 glob 是 shell 处理的
    Windows 是直接传原始命令行
    hsfzxjy
        2
    hsfzxjy  
       May 25, 2021 via Android   ❤️ 1
    echo '*' 就不会展开了
    orcusfox
        3
    orcusfox  
       May 25, 2021 via iPhone
    *是特殊字符,需要加斜杠转义或者用单引号括起来
    AndyAO
        4
    AndyAO  
    OP
       May 26, 2021
    @codehz 任何命令的实际参数中只要有类似于*这样的元字符,Shell 都会预先处理,返回路径数组?
    AndyAO
        5
    AndyAO  
    OP
       May 26, 2021
    @hsfzxjy 为什么会出现这种情况?
    这个现象有文档记录吗?如果有在哪?
    no1xsyzy
        6
    no1xsyzy  
       May 26, 2021
    @AndyAO `man bash` ,搜索 「 Pathname Expansion 」
    传入了以后如何看待这个 '*' 是被调用的程序本身的想法,说不定被认为是正则的一部分,或者 python -c "print(*range(100))"
    请亲手试试以下代码在不同系统下的行为:

    python -c "import sys; print(sys.argv)" *
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4794 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 01:09 · PVG 09:09 · LAX 18:09 · JFK 21:09
    ♥ Do have faith in what you're doing.