【发布时间】: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输出本身就容易损坏。