如何实现shell输入重定向

时间:2012-11-16 03:00:23

标签: linux shell unix

如何编写一个从文件中收集内容并输入命令的shell? 它看起来像:$ command<输入文件 我不知道如何开始。

4 个答案:

答案 0 :(得分:1)

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`

答案 1 :(得分:0)

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

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

因此,您应该将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);
}

答案 2 :(得分:0)

您可以使用命令read来读取bash脚本中的输入:

<强> 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   

答案 3 :(得分:0)

您可以使用xargs

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

cat your_file|xargs wc -l

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

的输入传递

因此输出将是输入文件中名称存在的所有文件的行数 这里的主要内容是xargs会将每一行作为wc -l

的输入传递