1. 程式人生 > >shell指令碼學習第四彈-管道與IO重定向

shell指令碼學習第四彈-管道與IO重定向

shell指令碼學習第四彈-管道與IO重定向


一、IO介紹
什麼是IO?簡單的來說,IO就是輸入輸出;在unix裡面,我們必須要標準輸入,標準輸出和標準錯誤。我們可以用程式執行過程來更明顯說明:程式的輸入就是標準輸入,程式處理完之後,輸出結果就是標準輸出,或者報錯就是標準錯誤。
在shell程式設計裡面,我們用cat命令就可以很好的解釋這個標準輸入和標準輸出,請看案例:

shell$ cat
cd
cd
vf
vf
bg
bg
^C

很顯然,我們輸入什麼,就會相應的輸出來。


二、管道
顧名思義,管道就像我們在生活中見到的管道是一樣的,只不過我們這裡是虛擬的,我們的管道就是一個管道和一個管道相連,也就是可以這麼說,上一個管道的出口就是下一個管道的入口,這麼精簡的回答很容易懂了吧。
在這裡插入圖片描述


在shell程式設計中,管道的表示方法是“|”,我們經常在命令中用到,比如:
$ cat point_num.c | grep -n "include" 1:#include<stdio.h> 2:#include<stdlib.h> 3:#include<string.h>
這就是管道的一種使用方法。
注意:我們在使用管道的時候,儘可能的把減少資料量的操作放在前面,因為管道的資料共享是在linux核心中通過拷貝實現的,減少資料量可以很大程度上提高效率。


三、重定向
重定向就是把標準輸出和標準輸入改寫到某個特定的檔案或者裝置中。
1.用 > 來改變標準輸出
command > file 將command的標準輸出重定向到檔案中,而不是列印在終端上。

C$ cat point_num.c > 1.txt
C$ cat 1.txt
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
   int num = 10;
   char* buf =  malloc(10);
   memset(buf,0,10);
//	char *buf = NULL;
   char* str = "hello";
   printf("%p\n",buf);
   memcpy(buf+1,str,10);
   printf("%p\n",buf+1);
   printf("%s\n",buf+1);
   free(buf);
}

我們會發現結果儲存在了1.txt檔案中。

2.用 < 來改變標準輸入
command < file 將command的標準輸入重定向到檔案
案例:

/C$ cat < struct.c > 1.txt
/C$ cat 1.txt 
#include<stdio.h>
void Print()
{
  printf("hello 000\n");
}
struct Test
{
  void (*Print)();
};
int main()
{
  struct Test test;
  test.Print = Print;
  test.Print();
  return 0;
}

所以,我們會發現把struct.c的檔案存到了1.txt檔案中,而且1.txt中原來的資料不見了。


3.追加檔案
command >> file 將command的追加到到檔案的末尾
案例:

/C$ cat point_num.c >> 1.txt
/C$ cat 1.txt 
#include<stdio.h>
void Print()
{
 printf("hello 000\n");
}
struct Test
{
 void (*Print)();
};
int main()
{
 struct Test test;
 test.Print = Print;
 test.Print();
 return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
 int num = 10;
 char* buf =  malloc(10);
 memset(buf,0,10);
//	char *buf = NULL;
 char* str = "hello";
 printf("%p\n",buf);
 memcpy(buf+1,str,10);
 printf("%p\n",buf+1);
 printf("%s\n",buf+1);
 free(buf);
}

我們會發現這個檔案追加到了1.txt後面。


歡迎大家關注微信公眾號:技術修煉之路,更多幹貨等你來拿。