请问 shell 中单竖线的参数传递为什么会没用?

# 我当前的目录下有一个 test.txt 文件 bash 执行以下命令无效
ls | grep tes | cat

echo 'bHMK' | base64 -d | bash
# bHMK 是 'ls' 的 base64 编码

实在搞不明白这个参数传递,为什么上面无效,ls 的结果作为 grep 的参数,然后结果再作为 cat 的参数,逻辑上没什么问题,但就是没有用

阅读 2.2k
3 个回答

|是管道符,代表前一个命令的标准输出会作为后一个命令的标准输入传入,根本不是你所理解的传递参数。担心文件名有特殊字符你可以改为更安全的方案:

find -name '*tes*' -type f -print0 | xargs -0 -r cat

find中使用-print0参数将换行符改为零字符\0输出,xargs的-0参数代表使用\0做参数分隔符,而不是shell默认的IFS。加上-r/--no-run-if-empty参数可以在没有标准输出的时候不运行后面的命令

可以看下cat的命令说明。cat不加参数的时候,是Copy standard input to standard output.,也就是拷贝标准输入到标准输出。

|输入的信息,对cat来说是标准输入,所以最后输出 test.txt 没毛病。


要是想输出文件内容,可以这样: ls | grep "xxxx" | xargs cat

如果你要的是【显示 test.txt 里面的内容】,可以写成:

ls | grep tes | xargs -I{} cat {}

或者:

cat *tes*
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题