【问题标题】:echo writes a variable to file with inverted commasecho 使用引号将变量写入文件
【发布时间】:2013-03-26 21:20:26
【问题描述】:

脚本代码:

    echo "Command?"
    read command

例如 command = echo "Hello world"

    $command > text.txt
    cat text.txt

输出是“Hello world”(带引号),但我需要与输出相同的输出 给出简单的

    echo "Hello world" > text.txt

即你好世界。我怎么才能得到它? 请记住,$command 可以采用任何值,必须在当前 bash 中执行,并且输出保存在文件中。

【问题讨论】:

  • "使用更多报价!"它们至关重要。另外,了解 ' 和 " 和 ` 之间的区别。参见 mywiki.wooledge.org/Quoteswiki.bash-hackers.org/syntax/words
  • 我不确定你想做什么。是echo "$command" > text.txt 吗?
  • 为了更安全:你不能建议一个可用命令的列表,并让用户输入该命令的编号吗?这样你就不会接受“一切”(如果接受一切,聪明/邪恶的用户几乎可以用你的脚本做任何事情。清理所有可能的输入非常非常困难)

标签: bash input echo


【解决方案1】:

你可以使用

eval "$command" > text.txt

但要小心——如果有人输入rm -rf /怎么办?

【讨论】:

  • 感谢 choroba!如果有人输入 rm -rf / 这将是他的问题:D 我需要编写一个从 shell 获取命令的代码,将它们像变量一样存储,执行并保存 stdout 或 stderr
【解决方案2】:

如果你需要eval一个命令然后保存STDOUT或者STDERR

对于STDOUT

eval "$command" > text.txt

对于STDERR

eval "$command" 2> text.txt

但是,请注意,eval 是“邪恶”的常见拼写错误。如果eval 是答案,那么您肯定问错了问题。见http://mywiki.wooledge.org/BashFAQ/048

最后但同样重要的是,“使用更多报价!”它们至关重要。另外,了解 ' 和 " 和 ` 之间的区别。参见 mywiki.wooledge.org/Quotes 和 wiki.bash-hackers.org/syntax/words

【讨论】:

  • 我刚刚发现如果 $command=clear 并且我使用 eval "$command" > text.txt 当前的 bash 窗口将不会被清理 =(
  • @Olga :这是因为“清除”通过向标准输出发送必要的东西来清除标准输出来工作。如果您将 STDOUT 重定向到“text.txt”,这些命令将发送到“text.txt”,而不再发送到原始 STDOUT(即终端)。如果您想同时发送到原始 STDOUT 和“file.txt”:使用:command | tee file.txt
猜你喜欢
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
相关资源
最近更新 更多