【问题标题】:Different behavior of special character ( ? ) in Fedora from different location不同位置的 Fedora 中特殊字符 (?) 的不同行为
【发布时间】:2023-04-02 01:41:01
【问题描述】:

我有一个 rpm 应用程序,它安装在 Fedora OS 的特定位置。

我的应用程序能够处理特殊字符 (?)。

当我从安装路径运行时,我的应用程序会获得 ? 参数。但是,当我复制到不同的位置时,当用户使用我的应用程序提供 ? 时,我会得到 1 作为参数。

安装路径/opt/myapp/

从安装路径执行./myapp ? --> 工作正常。我的应用程序将? 作为参数。

将myapp复制到不同的位置/home/

从新路径执行./myapp ? --> 我得到的命令行参数是1 而不是?

我明白 在 Fedora OS 中意味着“匹配任何一个字符”,但为什么它在安装路径中起作用?

【问题讨论】:

    标签: shell command-line-arguments fedora


    【解决方案1】:

    如果你想将?问号)传递给你的shell脚本,你需要转义它。

    例如myapp.sh:

     echo "The char is $1"
    

    用法:

    ./myapp.sh \?

    输出:

    字符是 ?

    没有转义,它搜索仅以一个字符命名的文件。 如果您的脚本与名为d 的文件位于同一文件夹中,它将输出The char is d

    【讨论】:

      【解决方案2】:

      我明白了吗?在 Fedora OS 中暗示“匹配任何一个字符”,但为什么它在安装路径中起作用?

      您的理解不准确1。它实际上所做的是尝试将参数与文件路径相匹配。所以./myapp ? 会查看当前目录中是否有文件名只有一个字符的文件:

      • 如果有,那么它将用一个或多个包含匹配项的参数替换整个参数。

      • 如果没有,? 按原样传递。

      请注意,此过程通常称为 globbing。您可以通过引用 ? 来抑制它,例如

       ./myapp \?
       ./myapp "?"
       ./myapp '?'
      

      另外,请注意通配符(?*)不会匹配文件名开头的 .。这就是为什么./myapp ?./myapp * 不会匹配... 目录,或者名称以. 开头的“隐藏”文件。


      1 - 这不仅仅适用于 Fedora。这适用于实现 POSIX shell 规范的 any shell。这包括所有现存版本的 UNIX、Linux 和 MacOS X,以及 Windows 10+ WSL、Cygwin、MinGW 等等。它也可能适用于应用程序实现类似 shell 的行为的环境,尽管这将取决于应用程序或编程语言。


      总结:

      在一种情况下,您得到1 而不是? 的原因是您在包含名称为1 的文件的目录中运行命令。

      解决方案......如果你不想匹配......是引用?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-13
        • 2018-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多