我正在研究Bash重定向,但我无法弄清楚如何正确使用“<”运营商和“|” (管道)操作员。我读到两者都会将一些信息作为输入传递给另一个程序。 “<” operator将文件的内容作为输入传递给程序/命令和“|” operator会将一个程序的 stdout 传递给另一个程序/命令,对吧?这是一个例子,我正在尝试传递一个目录,我希望将其列为 ls 的输入,但它不起作用:
$ cat test.txt
/home/renatov/Downloads
$ ls < test.txt
[it lists the current folder, not /home/renatov/Downloads folder]
使用管道操作员:
$ echo '/home/renatov/Downloads' | ls
[again, it lists the current folder, not /home/renatov/Downloads folder]
我推理的缺陷在哪里?为什么 ls 不接受这些内容作为输入?我对Bash重定向运算符做错了什么?
答案 0 :(得分:2)
重定向和管道使用stdout和stdin。具体来说,<
会将进程的stdin更改为右侧参数的文件描述符。
但是,ls
不会从标准输入读取!它只接受命令行上的参数。因为ls
不从stdin读取,所以无法使用重定向。
答案 1 :(得分:1)
您需要xargs功能:
fred:/tmp$ cat > test.txt
/tmp/test2.txt
/tmp/tmpDir
fred:/tmp$ touch test2.txt
fred:/tmp$ mkdir tmpDir
fred:/tmp$ touch tmpDir/test{1..3}.txt
fred:/tmp$ cat test.txt | xargs ls
/tmp/test2.txt
/tmp/tmpDir:
test1.txt test2.txt test3.txt
答案 2 :(得分:0)
你需要像
这样的东西ls $(echo '/home/renatov/Downloads')
或在第一个例子中
ls $(cat test.txt)