【问题标题】:How do I pass in the asterisk character '*' in bash as arguments to my C program?如何在 bash 中将星号字符“*”作为 C 程序的参数传递?
【发布时间】:2011-02-14 21:29:22
【问题描述】:

假设我有一个 C 程序,我从 bash 运行它:

$ ./a.out 123 *

程序会输出所有的命令行参数, 但它会改为显示这些:

论点 1:123
论据 2:a.out

我可以在我的程序中做些什么来解决这个问题?

【问题讨论】:

  • 我对那个有点心疼,@polygene。这当然是相似的,但另一个问题只是试图了解 为什么 * 不起作用。这个人想知道是否有办法在 C 代码本身中修复它。我的意见(在焦虑和咬牙切齿之后)是,这些问题足够清晰,值得单独离开。

标签: bash escaping


【解决方案1】:

你可以在shell中引用它

./a.out 123 '*'

在您的程序中您无能为力,因为 * 扩展是由 shell 完成的(与 Windows 相比,它是由​​程序完成的)。

【讨论】:

  • 没错。 Shell 在调用可执行文件之前扩展元字符,因此您的程序不知道用户键入了星号。这是良好的标准 Unix 行为,您不想“修复”它。如果您不希望 shell 扩展元字符,可以使用 \ 转义它们或将 args 放在单引号内。
【解决方案2】:

shell 正在用目录中每个文件的名称替换星号。

要传递文字星号,您应该能够将其转义:

$ ./a.out 123 \*

【讨论】:

  • 是的,我知道这会起作用,但我想知道是否可以在我的 C 程序中做任何事情,而不必改变我传入参数的方式
  • @Yz:我不是 bash 专家;我猜答案是“不容易”。
  • bash 专家;我的回答是“不!” :-) +1 用于反斜杠解决方案 - 这是首选 IMNSHO,因为引号将防止变量扩展。反斜杠单个字符不会产生这种副作用。
  • 您可以运行 bash -f 来完全禁用通配符/文件名扩展,尽管我不确定这是 OP 想要的。
  • 詹姆斯是正确的。你不能在 C 中对此做任何事情,因为 shell 将替换 * before 它调用你的程序。 C 程序无法确定通配符是传递给 shell 还是(在这种情况下)是手动输入的文件列表。为了将纯* 传递给您的C 程序,您必须使用\\* 对其进行转义(即告诉shell 不要像往常一样扩展它)。
【解决方案3】:

这与你的程序没有任何关系。

* 是 Bash 中的通配符,表示“当前目录中的所有文件”。如果您想将星号作为参数传递给您的程序,您可以像处理其他所有程序一样执行此操作:使用反斜杠转义或引用它。

【讨论】:

    【解决方案4】:

    另一个选项是使用set -f 来关闭扩展。比较:

    echo *
    

    v.s.

    set -f
    echo *
    

    您可以使用set +f 重新打开它:

    set -f
    echo *
    set +f
    echo *
    

    【讨论】:

      【解决方案5】:

      另一种选择是以#!/bin/bash -f 作为第一行开始您的脚本,这将允许您接受文字字符串作为参数(包括星号),从而允许您使用所需的输入运行./a.out 123 * ,但请注意 bash -f 完全禁用扩展,这可能会对您的脚本产生不利影响,具体取决于您的操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-01
        • 1970-01-01
        • 2018-05-20
        • 1970-01-01
        • 1970-01-01
        • 2012-10-27
        • 1970-01-01
        相关资源
        最近更新 更多