1. 程式人生 > >Shell I/O重定向與exec的使用介紹

Shell I/O重定向與exec的使用介紹

注:該文章例子來自於網路的收集和整理,附帶本人註解。

①I/O重定向的常用用法

符號             意義
cmd1 | cmd2     管道符,將cmd1的標準輸出作為cmd2的標準輸入。
> filename      將標準輸出寫到檔案filename之中。
< filename      將檔案filename的內容讀入到標準輸入之中。
>>filename      將標準輸出寫到檔案filename之中,若filename檔案已存在,則將標準輸出追加到filename已有內容之後。
>|filename      即使noclobber選項已開啟,仍然強制將標準輸出寫到檔案filename之中,即將filename檔案覆蓋掉。
n>|filename 即使noclobber選項已開啟,仍然使用FD為n以截斷模式開啟檔案filename。 n> filename 使用FD為n以截斷模式開啟檔案filename。 n< filename 使用FD為n以讀取模式開啟檔案filename。 n>>filename 使用FD為n以追加模式開啟檔案filename。 << delimiter 此處文件(Here-document)。

②exec命令的介紹

1,通過檔案描述符開啟或關閉檔案。
2,將檔案重定向到標準輸入,及將標準輸出重定向到檔案。
3
exec命令重新設定了I/O重定向,要恢復為原來的I/O指向,還得需要使用exec命令顯示指定。 exec用法: &n :代表描述符代表的檔案。 > < :代表以什麼形式使用描述符。 exec 8<&2 :描述符8以讀取方式開啟標準錯誤對應的檔案。 exec &>log:把標準輸入錯誤開啟檔案logexec 8<&- :關閉描述符8

1):run.sh指令碼使用exec將stdin(標準輸入)重定向到檔案

[email protected]37C:~# cat run.sh
#!/bin/bash
exec 8<&0
# 標準輸入預設是指向了鍵盤,複製一份到 8 中,8 也指向了鍵盤。 exec 0< hfile # 1. 使用標準輸入開啟檔案hfile。 read a # 2. read 將從stdin中讀取命令。 read b echo "---------------------------" echo $a echo $b echo "Close FD 8:" exec 0<&8 8<&- #將FD-8 copy到標準輸入(恢復指向鍵盤),否則,標準輸入還是指向hfile。 echo -n "Pls. Enter Data: " #這裡,標準輸入重新指向了鍵盤。 read c #需要我們手工鍵入字元。 echo $c exit 0

結果輸出:

# hfile檔案的內容。
root@37C:~# cat hfile 
value1
value2

root@37C:~# ./run.sh 
---------------------------
value1
value2
Close FD 8:
Pls. Enter Data: value3
value3
root@37C:~# 

2):run.sh指令碼將stdout重定向到檔案

[email protected]37C:~# cat run.sh
#!/bin/bash
exec 8>&1              # 開啟 FD-8,並使它指向顯示器。
exec 1> log            # 將標準輸出指向log檔案
echo '------redirect to log file-------'
# 這部分輸出會儲存在log檔案裡面。
echo "Output of date command:"
date                   
echo "Output of df command:"
df
sleep 5s   # 先睡 5 秒,以區分兩個結果輸出。
exec 1>&8 8>&-
echo "------termincal display:-------"
echo "Output of date command"
date
echo "Output of df command"
df

結果輸出:

[email protected]37C:~# ./run.sh 
------termincal display:-------
Output of date command
20160920日 星期二 16:02:08 CST
Output of df command
檔案系統          1K-塊    已用     可用 已用% 掛載點
udev             355032       0   355032    0% /dev
tmpfs             75824    3020    72804    4% /run
/dev/sda1      17673004 6600160 10152064   40% /
tmpfs            379108     132   378976    1% /dev/shm
tmpfs              5120       4     5116    1% /run/lock
tmpfs            379108       0   379108    0% /sys/fs/cgroup
tmpfs             75824      48    75776    1% /run/user/1000
[email protected]37C:~# cat log
------redirect to log file-------
Output of date command:
20160920日 星期二 16:02:03 CST
Output of df command:
檔案系統          1K-塊    已用     可用 已用% 掛載點
udev             355032       0   355032    0% /dev
tmpfs             75824    3020    72804    4% /run
/dev/sda1      17673004 6600160 10152064   40% /
tmpfs            379108     132   378976    1% /dev/shm
tmpfs              5120       4     5116    1% /run/lock
tmpfs            379108       0   379108    0% /sys/fs/cgroup
tmpfs             75824      48    75776    1% /run/user/1000
[email protected]37C:~# 

3):&>file將stdout和stderr重定向到檔案

    #!/bin/bash  
    exec 8>&1 9>&2      #FD 1複製到FD 8,FD 2複製到FD 9  
    exec &> log         #&>符號將stdout和stderr重定向到檔案log  

    ls z*               #錯誤寫入檔案log  
    date                #輸出寫入檔案log  
    exec 1>&8 2>&9 8<&- 9<&-      #恢復關閉操作  
    echo "-----------------"  
    echo "Close FD 8 and 9:"  
    ls z*  
    date  

4):普通例子

_1):使用檔案描述符3以讀取模式開啟檔案run.py

root@37C:~# exec 3<run.py 
root@37C:~# cat <&3
#!/usr/bin/python3
# -*- coding:utf-8  -*-
import logging
logging.basicConfig(level=logging.INFO)

s = '0'
n = int(s)
logging.info('n = %d' % n)
print(10 / n)
root@37C:~# 

_2):使用檔案描述符4以截斷模式開啟檔案log

root@37C:~# exec 4>log
root@37C:~# echo " I think befor I am" 1>&4
root@37C:~# cat log
 I think befor I am
root@37C:~# 

_3):使用檔案描述符5以追加模式開啟檔案log

root@37C:~# exec 5>>log
# 這裡echo 使用'>'而非'>>'來進行追加。
root@37C:~# echo 'say again: I think before I am!' >&5
root@37C:~# cat log
 I think befor I am
say again: I think before I am!

_4):exec 執行後的觀察。

# FD 8,9也指向了FD 0,1所指向的檔案。
[email protected]37C:~# exec 9>&1
[email protected]37C:~# exec 8<&0
[email protected]37C:~# ls -l /proc/self/fd/ 
總用量 0
lrwx------ 1 root root 64 9月  21 21:03 0 -> /dev/pts/2
lrwx------ 1 root root 64 9月  21 21:03 1 -> /dev/pts/2
lrwx------ 1 root root 64 9月  21 21:03 2 -> /dev/pts/2
lr-x------ 1 root root 64 9月  21 21:03 3 -> /proc/20455/fd
lrwx------ 1 root root 64 9月  21 21:03 8 -> /dev/pts/2
lrwx------ 1 root root 64 9月  21 21:03 9 -> /dev/pts/2

③ 嘗試題

# 嘗試一下的操作結果會如何?
root@37C:~# exec 0<run.sh

相關推薦

Shell I/O定向exec的使用介紹

注:該文章例子來自於網路的收集和整理,附帶本人註解。 ①I/O重定向的常用用法 符號 意義 cmd1 | cmd2 管道符,將cmd1的標準輸出作為cmd2的標準輸入。 > filename 將標準輸出

Shell I/O定向的原理解釋

在Unix系統中,每個程序都有STDIN、STDOUT和STDERR這3種標準I/O,它們是程式最通用的輸入輸出方式。幾乎所有語言都有相應的 標準I/O函式 ,比如,C語言可以通過scanf從終端輸入字元,通過printf向終端輸出字元。熟悉Shell的朋友都知

06 I/O定向管道符

文件中 輸入輸出 行數據 cat 命令 負載 結構 系統默認 總線 .com   首先,我們知道我們的計算機結構,在第一節的時候已經介紹過了,CPU進行數據運算,同時控制器負責指令的發送,而內存則是數據存儲的地方,CPU讀取的數據均從內存中調取。電腦除了CPU和內存外,

linux i/o定向管道程式設計

1.Linux 使用三種流: 0:stdin           標準輸入 1:stdout        標準輸出 2:stderr         標準錯誤輸出 2.預設的連線是tty 如果輸入sort,按回車鍵,終端將會連線到sort工具上。隨便輸入幾行文字,當按下

Liunx學習筆記之文件權限I/O定向

ima 所有 讀取 區別 命令執行 com ror 重定向 cd 命令 一、文件權限 1. 文件權限 在 Linux 中有四種訪問權限,列舉如下 可讀取:r,Readable 可寫入:w,Writable 可執行:x,Execute 無權限:- 我們可以使用 ls -l

Linux Bash Shell學習 十七 I/O定向

                  本文也即《Learning the bash Shell》3rd Edition的第七章Input/Output and Command-Line Processing之讀書筆記之一。我們曾經學習過shell的基本IO重定向操作:>、<和|。基本上能滿足95%的

20181205 I/O 定向

I/O 重定向 一.標準輸入、標準輸出、標準錯誤file descriptors (FD,檔案描述符 或 Process I/O channels):程序使用檔案描述符來管理開啟的檔案[[email protected] ~]# ls /proc/$$/fd0 1 2 3 40, 1, and 2

20181205 I/O 定向

esc 輸出 ext src -c channels vim nag proc I/O 重定向 一.標準輸入、標準輸出、標準錯誤file descriptors (FD,文件描述符 或 Process I/O channels):進程使用文件描述符來管理打開的文件[roo

管理及I/O定向

顯示屏 寄存器 標準輸入 stdin 系統 存在 輸出 設備 block 程序 :指令和數據控制器:指令運算器:數據存儲器:RAM地址總線:內存尋址數據總線:傳輸數據控制總線:控制指令寄存器:CPU暫時存儲器I/O :硬盤 Input Output系統設定:默認輸出設備

C++ I/O 定向方法(定向到串列埠或Socket)

C++ 標準輸入輸出模組,為字元流操作提供了便捷的途徑,軟體開發當中,尤其是嵌入式系統開發當中,有時候需要把流資訊重新定向到特定的埠,如串列埠,乙太網,USB等。如標準輸入輸出cout, cin預設將字元流定向到螢幕或控制檯。本文介紹瞭如何過載streambuf使得使用

9.I/O定向和管道

標準輸入重定向(STDIN,檔案描述符為0):預設從鍵盤輸入。 標準輸出重定向(STDOUT,檔案描述符為1):預設輸出到螢幕。 錯誤輸出重定向(STDERR,檔案描述符為2):預設輸出到螢幕。 1.IO重定向 IO重定向:就是把一些預設輸入輸出

第十章 I/O定向和管道

0.摘要 概念與技巧 -I/O重定向:概念與原因 -標準輸入,輸出和標準錯誤的定義 -重定向標準I/O到檔案 -使用fork來為其他程式重定向 -管道(Pipe) -建立管道後呼叫fork 相關的系統呼叫與函式 -dup,dup2 -pipe

shell i/o交互及定向

dev 重定向 設備 stderr 執行 標準 文件描述 std 直接 標準輸入:/dev/stdin,文件描述號:0,默認設備:鍵盤 標準輸出:/dev/stdout,文件描述號:1,默認設備:顯示器 標準錯誤輸出:/dev/stderr,文件描述號:2,默認設備:顯

linux shell 指令碼【3】 ---- 定向 tee 命令

1.重定向: echo "ABCD"  > temp.txt 將ABCD寫入到temp.txt中 echo "ABCD" >> temp.txt 講ABCD追加到temp.txt中 其中  > 相當於 1>

Shell 腳本學習筆記十:Shell輸入輸出定向

描述符 獨立 文件重定向 eof 輸出 合並 包含 span 輸出重定向 command > file 將輸出重定向到 file。 command < file 將輸入重定向到 file。 command >> file

Linux學習筆記之管道、定向正則表達式

linux管道與重定向 linux學習筆記 linux 正則表達式 管道:前一個命令的輸出,作為後一個命令的輸入命令1 | 命令2 | 命令3| 命令4 #tee 即在顯示器顯示,又在文件在保存文件例#echo “hello ,word” | tee /tmp/ hello.out例#wc -l

Java IO編程全解(六)——4種I/O的對比選型

log jdk 狀態 來源 回調 現在 概念 core avr   轉載請註明出處:http://www.cnblogs.com/Joanna-Yan/p/7804185.html   前面講到:Java IO編程全解(五)——AIO編程   為了防止由於對一些技術概念和

管道符、定向環境變量

alias 標準 翻頁 重要 防止 grep 反斜杠 信息 9.png 1.輸入輸出重定向 1.輸入重定向:把文件導入到命令中。 符號及作用: 命令 < 文件 : 將文件作為命令的標準輸入 命令 << 分界符 : 從標準輸入中讀入,直到遇到分界符才停止

定向管道

概念 join 分隔 附加 操作 awk err 數據管道 inf 1.Bash 實際上使用三種標準輸入輸出流: ? 標準輸出流(stdout),顯示來自命令的輸出,文件描述符是 1。? 標準錯誤輸出流(stderr),顯示來自命令的錯誤輸出,文件描述符是 2。? 標準輸入

linux學習第一周;標準輸入、輸出和錯誤定向管道

例子 OS clas 管道 text 默認 post 錯誤 gpo 標準輸入 標準輸出 標準錯誤 重定向: < #標準輸入重定向,默認為鍵盤輸入,利用<可以將文件代替鍵盤輸入 > #標準輸出重定向(會覆蓋1.text裏面的內容);例子:ls > /d