Linux的强大,就是可以把很多完成单一功能的命令行程序通过串联的方式组合在一起,就可以完成非常复杂的功能,并且只需要漂亮的一行代码搞定。是不是很神奇。
多个命令串联执行, 大家都熟知的应该就是管道 | 了,但是管道给第二个命令传递是直接传到命令的输入上,这种方式要求命令本身的支持,支持的命令较少。
就是命令需要支持从 stdin 的标准输入读取输入信息的命令才能使用 管道进行串联。 但是大部分的程序是通过入参来读取输入信息的。这个时候就需要其他的支持了。
下面我们重点讲 “xargs”和“exec”
xargs,是把第一个命令的输出作为参数传递到第二个命令上,这种方式只要第二个命令可以接受参数即可,支持的命令较多。
- find ./kernel/msm-4.19/drivers/usb -name "Kconfig" | cat
- find ./kernel/msm-4.19/drivers/usb -name "Kconfig" | xargs cat
- find ./kernel/msm-4.19/drivers/usb -name "Kconfig" -exec cat {} \;
上面指令中的第一行代码仅仅是输出找到文件列表
上面指令中的第二行代码就是输出找到的每一个文件的文件内容
上面指令中的第三行代码和第二行代码输出的内容一致。
xargs还有-d分隔符选项, -p等待选择执行的选项, -n代表每次传递几个参数的选项
find ./kernel/msm-4.19/drivers/ -name "Kconfig" -exec echo {} \; -exec grep -w "USB_PD" {} \;
- root@ubuntu:/home/Open-Q_865_Android-Q_v1.1# find ./kernel/msm-4.19/drivers/ -name "Kconfig" |xargs grep -w "USB_PD"
- ./kernel/msm-4.19/drivers/usb/pd/Kconfig:config USB_PD
- ./kernel/msm-4.19/drivers/usb/pd/Kconfig: select USB_PD
find ./kernel/msm-4.19/drivers/ -name "Kconfig" |xargs grep -w "USB_PD"|xargs grep "select"
经过我的测试, |xargs 和 -exec 除了使用的语法不一样,功能一样。
- root@ubuntu:/home/Android-Q_v1.1# find ./ -name rdbg.ko|grep kona | xargs md5sum
- 573c3a555c3e6ec3176beef369fd366a ./out/target/product/kona/vendor/lib/modules/rdbg.ko
- 573c3a555c3e6ec3176beef369fd366a ./out/target/product/kona/dlkm/lib/modules/rdbg.ko
- 76b2360a6e2d2caacd2a5b25225af4a8 ./out/target/product/kona/obj/kernel/msm-4.19/drivers/char/rdbg.ko
- 573c3a555c3e6ec3176beef369fd366a ./out/target/product/kona/obj/kernel/msm-4.19/staging/lib/modules/4.19.81+/kernel/drivers/char/rdbg.ko
- 573c3a555c3e6ec3176beef369fd366a ./out/target/product/kona/obj/PACKAGING/target_files_intermediates/kona-target_files-eng.root/VENDOR/lib/modules/rdbg.ko
- 573c3a555c3e6ec3176beef369fd366a ./out/target/product/kona/obj/PACKAGING/depmod_vendor_intermediates/lib/modules/0.0/vendor/lib/modules/rdbg.ko
- 573c3a555c3e6ec3176beef369fd366a ./kernel/ship_prebuilt/primary_kernel/out/target/product/kona/dlkm/lib/modules/rdbg.ko