我是Linux新手并尝试通过一些在线资源和搜索来学习shell。我的问题是关于管道和重定向。我想列出" ls"一个文件名并直接输入到" cat"使用管道查看其内容。 所以我正在做的是:
ls chap*.pdf|cat
另外,我想列出' ls"一个文件并将文件名输入到文件中,然后使用" cat"来查看该文件的内容。
ls chap*.pdf> file1 < cat
它似乎无法奏效。请帮忙。还有多个重定向命令执行的顺序是什么? 感谢
答案 0 :(得分:1)
cat
检索要从其命令行连接的文件列表,而不是从其stdin 连接;管道连接到标准输入。因此,如果您希望将文件名打印到这些文件的内容而不是它们的名称,则无法将文件名传递到cat
。
正确的用法,而不是管道,是使用shell globbing来填写这些名称:
cat chap*.pdf
如果你坚持使用文件名管道,NUL-分隔它们并使用xargs -0,因为xargs
从stdin读取并将它读取的内容放到它运行的软件的命令行上:
printf '%s\0' chap*.pdf | xargs -0 cat
上面建议使用printf '%s\0'
和xargs -0
,因为在UNIX文件名中使用换行符的换行符是不安全的,因为UNIX文件名可以包含换行符。想想如果其他人跑了会发生什么:
mkdir -p $'chap\n/etc/passwd\n'
touch $'chap\n/etc/passwd\n/.pdf'
...由于换行符,您的程序将无法读取此文件 - 但如果您执行递归搜索,则还要打印/etc/passwd
到了屏幕!
如果您 将使用xargs
而不使用-0
,则至少使用-d '\n'
(如果在GNU平台上并且能够执行所以;在非GNU系统上 - 除非像MacOS一样,他们复制-0
扩展名 - xargs
是不可取的:
printf '%s\n' chap*.pdf | xargs -d '\n' cat
请注意以前关于包含换行符的文件名的警告!