【问题标题】:C program command line argument with spaces带空格的 C 程序命令行参数
【发布时间】:2016-04-20 13:23:00
【问题描述】:

我的 python 程序 program.py 打印带有空格的文本,而我的 C 程序 a.out 只需要一个命令行参数。为什么这两种方法之间存在不同的行为...即为什么方法 1 有效而不是方法 2?

方法一:

# program.py
print("Hello world")

终端:

> ./a.out "$(python program.py)"
// Program successfully run

方法二:

# program.py
print("\"Hello world \"")

终端:

> ./a.out $(python program.py)
// Error- only one command line argument expected

【问题讨论】:

  • ...因为您的命令行 shell 将 $ 和 ( 和 ) 解释为命令的一部分,而不是单个字符串参数的一部分。像你第一次那样在命令行参数周围使用" 是正确的。
  • 非常有趣。在第二种情况下,您将获得第一个 agument "Hello 和第二个 world "。在重新解析$() 的结果时,bash 似乎忽略了引号和转义字符。

标签: python c


【解决方案1】:

方法一:

./a.out "$(python program.py)"

./a.out 将使用 "$(python program.py)" 作为字符串
echo "$(python program.py)" prints "$(python program.py)"

方法二:

./a.out $(python program.py)

./a.out 将使用 $(python program.py) 的结果作为参数。
echo $(python program.py) 将运行程序,打印的内容将用作参数。

因为你已经打印了Hello world,它会使用Hello 作为第一个参数,而world 作为第二个参数。 它会导致类似
./a.out Hello World

【讨论】:

    【解决方案2】:

    显然,每当你使用 $something 时,如果你有空格,它总是会被分成几个参数。 看看 $1 是如何工作的,它的行为是一样的。 然后你的 $(command) 将同样工作。 这就是为什么你必须在它周围加上引号。

    我试过了:

    ls $(echo '"Hello World!"')
    

    它的行为与您的第二种方法相同。

    还有这个:

    ls "$(echo 'Hello World!')"
    

    和你的第一种方法一样。

    【讨论】:

      猜你喜欢
      • 2018-12-14
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 2016-10-26
      • 2018-10-05
      • 2014-05-22
      相关资源
      最近更新 更多