如何实现shellinputredirect

如何编写一个从文件中收集内容并input到命令的shell? 它会像这样:$ command <inputfile我不知道如何启动。

wc为例:

 $ wc < input_file > output_file 

说明

  • wc :这是你正在调用的命令(或shell内置)
  • < input_file :从input_file读取输入
  • > output_file': write output into output_file`

请注意,许多命令将接受输入文件名作为它的一个cmdline参数(不使用< ),例如:

  • grep pattern file_name
  • awk '{print}' file_name
  • sed 's/hi/bye/g file_name`

您需要将shell程序的输入文件描述符指向输入文件。 在c中,通过调用int dup2(int oldfd, int newfd); 其工作是将newfd作为oldfd的副本,必要时首先关闭newfd。
在Unix / Linux中,每个进程都有自己的文件描述符,存储如下:

0 – 标准输入(标准输入)1 – 标准输出(标准输出)2 – 标准错误(标准错误)

所以你应该把stdin描述符指向你想要使用的输入文件。 这是几个月前我写的:

 void ioredirection(int type,char *addr) { // output append redirection using ">>" if (type == 2) { re_file = open(addr, O_APPEND | O_RDWR, S_IREAD | S_IWRITE); type--; } // output redirection using ">" else if (type==1) re_file = open(addr, O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); // input redirection using "<" or "<<" else re_file = open(addr, O_CREAT | O_RDWR, S_IREAD | S_IWRITE); old_stdio = dup(type); dup2(re_file, type); close(re_file); } 

你可以使用命令read从bash脚本的输入中read

inputreader.sh

 #!/bin/bash while read line; do echo "$line" done 

产量

 $ echo "Test" | bash ./inputreader.sh Test $ echo "Line 1" >> ./file; echo "Line 2" >> ./file $ cat ./file | bash ./inputreader.sh Line 1 Line 2 $ bash ./inputreader.sh < ./file Line 1 Line 2 

你可以使用xargs

例如你有一个文件,它有一些文件名的列表。

 cat your_file|xargs wc -l 

wc -l是你的命令catxargs会把文件中的每一行作为wc -l的输入

所以输出将是所有文件的名称都在输入文件主目录中的行的计数这里是xargs将传递每一行作为输入wc -l