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:把標準輸入錯誤開啟檔案log。
exec 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
2016年 09月 20日 星期二 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:
2016年 09月 20日 星期二 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