管道和重定向

时间:2014-10-22 16:22:48

标签: bash

我是Linux新手并尝试通过一些在线资源和搜索来学习shell。我的问题是关于管道和重定向。我想列出" ls"一个文件名并直接输入到" cat"使用管道查看其内容。 所以我正在做的是:

ls chap*.pdf|cat

另外,我想列出' ls"一个文件并将文件名输入到文件中,然后使用" cat"来查看该文件的内容。

ls chap*.pdf> file1 < cat

它似乎无法奏效。请帮忙。还有多个重定向命令执行的顺序是什么? 感谢

1 个答案:

答案 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

请注意以前关于包含换行符的文件名的警告!