如何使用通过管道传递的另一个命令的参数来执行相同的命令?
从源中提取文件名的结果是:
$some_command 文件名1 文件名2 文件名3 ... 文件名N
我想用 创建具有这些文件名的文件touch
。我怎样才能循环touch
遍历这些名称?
答案1
我只在非常简单的情况下使用 for...do...done。
对于更复杂/危险的情况:
command | sed 's/^/touch /'
这不执行任何操作,只是打印预期的命令。查看结果,然后执行相同的操作sh -x
(-x
标志用于调试):
command | sed 's/^/touch /' | sh -x
答案2
您可以使用 xargs 和 -n1 为每个管道参数运行一次命令
$some_command | xargs -n 1 touch
然而,对于接受多个参数的 touch
touch `$some_command`
也许对你有用。
答案3
for i in `$some_command`; do touch $i; done
答案4
“some_command | xargs touch” 可能会起到作用,但是有两个陷阱:
- 如果文件名包含任何空格字符,它将被视为分隔符,例如,文件名“fuh bar”将被“触摸”为名为“fuh”的文件和另一个名为“bar”的文件,而不是单个“fuh bar”。为了缓解这种情况,您可以检查“some_command”是否能够生成另一个分隔符,通常是 NULL(请参阅命令“find”中的“-print0”参数合法性),并使用 xargs 的“--null”参数
- 如果命令没有产生任何结果,xargs 将失败。使用其“--no-run-if-empty”参数