573 瀏覽數

Linux 的資料導向

使用 Linux 指令時,輸出太多時會不方便閱讀,這時可以透過 資料導向 這個功能.

標準輸出 (stdout)

Linux 下版標準輸出是顯示器,我們可以利用 > 或 >> 將標準輸出 (stdout) 做導向,下面的例子將執行結果導向到檔案.

root@ubuntu:~# ifconfig ens33 > ifconfig.txt
root@ubuntu:~# cat ifconfig.txt 
ens33     Link encap:Ethernet  HWaddr 00:0c:29:6d:a9:f0  
          inet addr:172.16.15.129  Bcast:172.16.15.255  Mask:255.255.255.0
          inet6 addr: fe80::d486:b6ac:858e:5140/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3189 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1621 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4085940 (4.0 MB)  TX bytes:113281 (113.2 KB)

標準輸出 (stdout) 的代碼為 1,所以有時你會看到下面這種用法 1> .

root@ubuntu:~# ifconfig ens33 1> ifconfig.txt
root@ubuntu:~# cat ifconfig.txt 
ens33     Link encap:Ethernet  HWaddr 00:0c:29:6d:a9:f0  
          inet addr:172.16.15.129  Bcast:172.16.15.255  Mask:255.255.255.0
          inet6 addr: fe80::d486:b6ac:858e:5140/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3189 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1621 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4085940 (4.0 MB)  TX bytes:113281 (113.2 KB)

資料的導向有分兩種模式 > >> , >> 的做法是資料的導向是以附加後面的方式來處理.
下面的例子就是透過 附加導向的方式來處理.

root@ubuntu:~# ifconfig ens33 > ifconfig.txt
root@ubuntu:~# ifconfig lo >> ifconfig.txt
root@ubuntu:~# cat ifconfig.txt 
ens33     Link encap:Ethernet  HWaddr 00:0c:29:6d:a9:f0  
          inet addr:172.16.15.129  Bcast:172.16.15.255  Mask:255.255.255.0
          inet6 addr: fe80::d486:b6ac:858e:5140/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3249 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1661 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4090790 (4.0 MB)  TX bytes:117769 (117.7 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:229 errors:0 dropped:0 overruns:0 frame:0
          TX packets:229 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:17843 (17.8 KB)  TX bytes:17843 (17.8 KB)

標準錯誤輸出 (stderr)

直接來看看下面這個範例,程式輸出錯誤到顯示器上而且沒有把這個內容導向檔案.

root@ubuntu:~# ifconfig 123 > ifconfig.txt 
123: error fetching interface information: Device not found
root@ubuntu:~# cat ifconfig.txt

輸出 (stdout) 的導向有兩種,第一種就是 標準輸出 (stdout) 的代碼為 1 ,第二種就是 標準錯誤輸出 (stderr) 代碼為 2,所以需要使用 2> , 或是 2>> 的方式才能將錯誤的內容做導向.

root@ubuntu:~# ifconfig 123 2> ifconfig.txt 
root@ubuntu:~# cat ifconfig.txt 
123: error fetching interface information: Device not found

標準輸出 (stdout)+標準錯誤輸出 (stderr)

如果要同時將正確與錯誤的資料都寫入同一個檔案可以使用下面兩種語法 2>&1 , &> .

root@ubuntu:~# ifconfig 123 > ifconfig.txt 2>&1
root@ubuntu:~# cat ifconfig.txt 
123: error fetching interface information: Device not found
root@ubuntu:~# ifconfig ens33 >> ifconfig.txt 2>&1
root@ubuntu:~# cat ifconfig.txt 
123: error fetching interface information: Device not found
ens33     Link encap:Ethernet  HWaddr 00:0c:29:6d:a9:f0  
          inet addr:172.16.15.129  Bcast:172.16.15.255  Mask:255.255.255.0
          inet6 addr: fe80::d486:b6ac:858e:5140/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3578 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1835 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4123223 (4.1 MB)  TX bytes:139668 (139.6 KB)

第二種方式會比較簡潔.

root@ubuntu:~# ifconfig 123 &> ifconfig.txt
root@ubuntu:~# ifconfig ens33 &>> ifconfig.txt 
root@ubuntu:~# cat ifconfig.txt 
123: error fetching interface information: Device not found
ens33     Link encap:Ethernet  HWaddr 00:0c:29:6d:a9:f0  
          inet addr:172.16.15.129  Bcast:172.16.15.255  Mask:255.255.255.0
          inet6 addr: fe80::d486:b6ac:858e:5140/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3700 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1898 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4133761 (4.1 MB)  TX bytes:147352 (147.3 KB)

標準輸入 (stdin)

標準輸入 (stdin) 是鍵盤,我們一樣可以透過 < 做導向.

下面的範例是資料庫的還原.

root@ubuntu:~# mysql -u root -p wordpress < wordpress.sql

關於資料庫的使用請參考 http://benjr.tw/12352 , http://benjr.tw/12461

整理一下:

  • 標準輸入 (stdin) ,代碼為 0 ,可以使用 < , << , 0< 或 0<<
  • 標準輸出 (stdout) ,代碼為 1 ,可以使用 > , > , 1> 或 1>>
  • 標準錯誤輸出 (stderr) ,代碼為 2 ,可以使用 2> 或 2>>
  • 標準輸出 (stdout)+標準錯誤輸出 (stderr) , 可以使用 2>&1 , 2>>&1 , &> 或 &>>

發表迴響