Linux管道中如何在命令的不同位置插入参数?
Linux管道中如何在命令的不同位置插入参数?
嘿,我太懂你遇到的这个坑了!你想把文件里的两个数值(比如1和2)分别传给cal命令的-A和-B选项,结果用xargs -I的时候,它居然跑了两次cal,完全不是你想要的“一次命令带两个参数”的效果对吧?
先给你拆解下为啥-I不行:xargs -I的逻辑是逐行处理输入,每一行都会替换掉你指定的占位符(比如{}),然后执行一次命令。比如你要是这么写:
cat file-with-content.txt | xargs -I {} cal -A {} -B {}
那文件里第一行的1会变成cal -A 1 -B 1,第二行的2会变成cal -A 2 -B 2,自然就执行两次了,根本达不到把两个值分别放到-A和-B的目的。
那正确的做法该咋弄?我们需要让xargs一次性把所有输入的参数收过来,然后精准分配到cal的两个选项位置上,用sh -c来包裹命令就可以实现:
假设你的file-with-content.txt内容是:
1 2
用这个命令就能搞定:
cat file-with-content.txt | xargs sh -c 'cal -A "$1" -B "$2"' --
给你解释下这个命令的逻辑:
xargs会把文件里的两行内容(也就是1和2)作为整体参数传给后面的sh -c脚本--是用来占位脚本的$0(这个参数一般是脚本名,我们不需要实际内容,用它占位就行)$1和$2就分别对应了xargs传过来的第一个和第二个参数,也就是文件里的1和2,这样就能精准把值放到-A和-B的位置上,而且只会执行一次cal命令
这样是不是就解决了你头疼的问题?
备注:内容来源于stack exchange,提问作者Pola8976
相关产品推荐
相关产品推荐

