【问题标题】:Linux bash - eval vs. sh -cLinux bash - eval 与 sh -c
【发布时间】:2014-09-21 03:16:26
【问题描述】:

我一直在尝试一些 bash 脚本,但遇到了一个我不太了解的问题。我正在尝试打印目录中的所有文件,并使用打印输出不仅显示文件名,还显示大小和上次修改日期。我可以使用以下命令来做到这一点:

ls | xargs -I '{}' sh -c 'echo "{}" $(stat -c "%y %s" "{}")'

我从这篇文章中得到了sh -c 的使用:xargs with multiple commands(第一个答案)。我知道sh -c 部分是正在执行的命令,它将字符串作为命令读取。但是,我不太明白的是为什么其他命令不起作用,例如eval 代替sh -c。例如:

ls | xargs -I '{}' eval 'echo "{}" $(stat -c "%y %s' "{}")'

eval 不也将字符串作为参数然后计算它吗? (eval command in bash) 我知道我有一个使用sh -c 的命令,但我想知道为什么这个命令与eval 不同。

【问题讨论】:

  • eval 是一个shell内置命令; xargs 需要一个可执行文件。
  • 是说当我使用sh -c 时,它会创建一个可执行文件然后传递给xargs
  • 简单的区别是sh -c 'stuff' 生成一个新进程,执行操作,然后进程消失:eval 'stuff' 在您的当前 shell 中执行操作。
  • sh 一个可执行文件,它将-c参数传递的字符串作为shell命令执行。
  • ...加强@anubhava 的回答——请参阅mywiki.wooledge.org/ParsingLs,了解为什么解析ls 输出本身就容易损坏。

标签: linux bash shell eval sh


【解决方案1】:

你真的不需要 evalsh -cls 解析。只需使用stat

stat -c "%n %y %s" *

【讨论】:

  • 感谢您的回答。它确实提醒我,我应该彻底查看不同的格式选项。但是,如果您能阐明sh -ceval 之间的区别,那就太好了。
  • @Zhouster 查看我对您问题的评论,但这是您要使用的代码。来自ls 和使用eval 的管道都表明你做错了。
  • eval 是一个 shell 公告,sh -c 允许您在分叉的子进程中运行命令行,但实际上两者都做同样的事情,如果您的命令行来自不受信任,两者都是有风险的来源。
  • 如果这是用于脚本使用,最好使用像%Y %s %n\0 这样的格式字符串——这样一旦你阅读了 mtime 和大小,任何直到下一个 NUL 字符都是名称的一部分(没有歧义的余地,因为 NUL - 与空格或换行符不同 - 不能存在于名称中)。
【解决方案2】:

xargs 只能运行外部可执行文件——操作系统的execv() 系列调用可以执行的东西。 (请记住,xargs 本身不是 shell 的一部分,而是一个外部程序,因此它无法访问启动它的 shell)。

shell 内置eval 不是可执行文件。因此,xargs 无法运行它。 (就其本质而言,它调用当前 shell 中的代码。xargs 不是 shell,因此它无法解释 shell 脚本,并且当 xargs 是活动进程时没有“当前 shell”。

sh 是一个可执行文件(启动一个新的 shell)。因此,xargs 可以启动它,并且可以在当前不存在 shell 的上下文中使用。


顺便说一句——你标记了这个问题bash,但sh不是bash。如果您希望能够在作为单独进程调用的 shell 下运行 bash 代码,请使用 bash -c,而不是 sh -c;由于sh -c 在进程外启动了一个单独的shell,因此您还可以获得具有不同功能的不同版本的不同shell(即使您的/bin/sh/bin/bash 的符号链接,bash 也会关闭一些以sh 启动时的功能。

【讨论】:

  • 谢谢查尔斯。我认为这为我的问题提供了最清晰、最深入的答案。
【解决方案3】:

sh -c 调用一个新的 shell,而eval 在当前 shell 上执行它。新 shell 内环境的任何变化都不会影响调用它的 shell。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-12
    • 2015-05-15
    • 2016-03-29
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多