2012-11-16 51 views
4

如何編寫一個從文件中收集內容並將其輸入命令的shell? 它看起來像:$命令<輸入文件 我不知道如何開始。如何實現shell輸入重定向

+0

歡迎來到StackOverflow!你真的想***寫一個shell ***,還是你想寫一個* shell腳本*?你目前閱讀了哪些文檔?這裏最成功的問題往往包括代碼,預期結果和實際結果。當問題顯示「我不知道如何開始」時,常見答案之一是「Google」。 – ghoti

回答

1

使用wc作爲一個例子:

$ wc <input_file> output_file 

說明

  • wc:這是要調用
  • < 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 `
0

你需要指出in把你的shell程序的文件描述符放到輸入文件中。在c中,通過調用int dup2(int oldfd, int newfd);來實現,其工作是使newfd成爲oldfd的副本,如果需要的話首先關閉newfd。
在Unix/Linux中,每個過程有其自己的文件的描述符,存儲這樣的:

0 - 標準輸入(stdin) 1 - 標準輸出(stdout) 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); 
} 
0

您可以輸入在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 
0

你可以使用xargs那個:

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

cat your_file|xargs wc -l 

wc -l是你的命令 catxargs將文件作爲輸入,每行傳遞給wc -l

所以輸出將他們的名字都出現在所有文件中的行數輸入文件 這裏主要的東西是xargs會通過每一行作爲輸入到wc -l