Bash重定向:无法理解为什么“<”和“|”不起作用

时间:2014-02-28 15:36:04

标签: bash redirect terminal

我正在研究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重定向运算符做错了什么?

3 个答案:

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