免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: admirer
打印 上一主题 下一主题

[转载]常用文件重定向命令  关闭 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2003-11-14 12:22 |只看该作者

[转载]常用文件重定向命令

疑问:您所说的不取消set -o noclobber而临时改写文件
是否指强行覆盖目标文件?
也就是说目标文件的内容被永久改变?

我这里测试的结果是这样的

论坛徽章:
0
12 [报告]
发表于 2003-11-14 14:33 |只看该作者

[转载]常用文件重定向命令

cat < file > file

  偶感觉应该是
    输入和输入不可以为同一个文件吧。。。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
13 [报告]
发表于 2003-11-14 15:16 |只看该作者

[转载]常用文件重定向命令

原帖由 "nocomment" 发表:
疑问:您所说的不取消set -o noclobber而临时改写文件
是否指强行覆盖目标文件?
也就是说目标文件的内容被永久改变?

我这里测试的结果是这样的

是的... 正是 >| 的意思...

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
14 [报告]
发表于 2003-11-14 15:19 |只看该作者

[转载]常用文件重定向命令

原帖由 "sunkey" 发表:
cat < file > file

  偶感觉应该是
    输入和输入不可以为同一个文件吧。。。


原因呢?下一節課再揭曉...  ^_^

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
15 [报告]
发表于 2003-11-19 02:50 |只看该作者

[转载]常用文件重定向命令

噹噹噹~~~ 上課囉~~~  ^_^

前面提到:$ cat < file > file 之後原本有內容的檔案結果卻被洗掉了﹗
要理解這一現像其實不難,這只是 priority 的問題而已:
* 在 IO Redirection 中,stdout 與 stderr 的管道會先準備好,才會從 stdin 讀進資料。
也就是說,在上例中,> file 會先將 file 清空,然後才讀進 < file ,
但這時候檔案已經被清空了,因此就變成讀不進任何資料了...

哦~~~ 原來如此~~~~  ^_^
那... 如下兩例又如何呢?
$ cat <> file
$ cat < file >> file

嗯... 同學們,這兩個答案就當練習題囉,下節課之前請交作業﹗

好了,I/O Redirection 也快講完了,sorry,因為我也只知道這麼多而已啦~~~ 嘻~~  ^_^
不過,還有一樣東東是一定要講的,各位觀眾(請自行配樂~!#@!$%) :
---- 就是 pipe line 也﹗

談到 pipe line ,我相信不少人都不會陌生:
我們在很多 command line 上常看到的" | "符號就是  pipe line 了。
不過,究竟 pipe line 是甚麼東東呢?
別急別急... 先查一下英漢字典,看看 pipe 是甚麼意思?
沒錯﹗它就是"水管"的意思...
那麼,你能想像一下水管是怎麼一根接著一根的嗎?
又,每根水管之間的 input 跟 output 又如何呢?
嗯??
靈光一閃:原來 pipe line 的 I/O 跟水管的 I/O 是一模一樣的:
* 上一個命令的 stdout 接到下一個命令的 stdin 去了﹗
的確如此... 不管在 command line 上你使用了多少個 pipe line ,
前後兩個 command 的 I/O 都是彼此連接的﹗(恭喜:你終於開竅了﹗  ^_^ )

不過... 然而... 但是...  ... stderr 呢?
好問題﹗不過也容易理解:
* 若水管漏水怎麼辦?
也就是說:在 pipe line 之間,前一個命令的 stderr 是不會接進下一命令的 stdin 的,
其輸出,若不用 2> 導到 file 去的話,它還是送到監視器上面來﹗
這點請你在 pipe line 運用上務必要注意的。

那,或許你又會問:
* 有辦法將 stderr 也餵進下一個命令的 stdin 去嗎?
(貪得無厭的家夥﹗)
方法當然是有,而且你早已學過了﹗  ^_^
我提示一下就好:
* 請問你如何將 stderr 合併進 stdout 一同輸出呢?
若你答不出來,下課之後再來問我吧... (如果你臉皮真夠厚的話...)

或許,你仍意尤未盡﹗或許,你曾經碰到過下面的問題:
* 在 cm1 | cm2 | cm3  ... 這段 pipe line 中,若要將 cm2 的結果存到某一檔案呢?

若你寫成 cm1 |  cm2 > file | cm3 的話,
那你肯定會發現 cm3 的 stdin 是空的﹗(當然啦,你都將水管接到別的水池了﹗)
聰明的你或許會如此解決:
cm1 | cm2 > file ; cm3 < file
是的,你的確可以這樣做,但最大的壞處是:這樣一來,file I/O 會變雙倍﹗
在 command 執行的整個過程中,file I/O 是最常見的最大效能殺手。
凡是有經驗的 shell 操作者,都會盡量避免或降低 file I/O 的頻率。

那,上面問題還有更好方法嗎?
有的,那就是 tee 命令了。
* 所謂 tee 命令是在不影響原本 I/O 的情況下,將 stdout 複製一份到檔案去。
因此,上面的命令行可以如此打:
cm1 | cm2 | tee file | cm3
在預設上,tee 會改寫目標檔案,若你要改為增加內容的話,那可用 -a 參數達成。

基本上,pipe line 的應用在 shell 操作上是非常廣泛的,尤其是在 text filtering 方面,
凡舉 cat, more, head, tail, wc, expand, tr, grep, sed, awk, ... 等等文字處理工具,
搭配起 pipe line 來使用,你會驚覺 command line 原來是活得如此精彩的﹗
常讓人有"眾裡尋他千百度,驀然回首,那人卻在燈火闌珊處﹗"之感...  ^_^

....

好了,關於 I/O Redirection 的介紹就到此告一段落。
若日後有空的話,再為大家介紹其它在 shell 上好玩的東西﹗bye...  ^_^

網中人
2003-11-19 @taiwan

论坛徽章:
0
16 [报告]
发表于 2003-11-19 09:34 |只看该作者

[转载]常用文件重定向命令

cat <file >>file比较好理解
最后的结果应该是死循环
file最终的内容应该是原file内容的不断重复

但cat <> file的结果俺还真不理解,汗~~

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
17 [报告]
发表于 2003-11-24 15:38 |只看该作者

[转载]常用文件重定向命令

up一下,希望网中人斑竹能解释一下cat<file>>file和cat<>file的意思 ^_^

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
18 [报告]
发表于 2003-11-24 15:54 |只看该作者

[转载]常用文件重定向命令

哦... 我也不很確定,也是猜的:  ^_^
1) cat < file >> file , stdin 在讀進時永無 ending 是因為 >> 一直在增加...
2) cat <> file 是說 stdin 與 stdout 都是同一 file 。一般除了用來 test device 之外,沒啥實質用途。

當然了,或許要請真懂資料結構及作業系統的程式專家來說明,才能給大家一個較明確的答案。

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
19 [报告]
发表于 2003-11-24 16:10 |只看该作者

[转载]常用文件重定向命令

啊,刚才试了下:
  1. $cat test_file
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. $cat<test_file>>test_file
  8. cat: input/output files 'test_file' identical
复制代码

这个....

  1. $cat <>test_file
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
复制代码

这说明这条命令和cat<test_file>test_file是不一样的:
  1. $cat<test_file>test_file
  2. cat: input/output files '-' identical
复制代码


这些怎么解释?我已经晕了 @_@

论坛徽章:
0
20 [报告]
发表于 2003-11-24 18:14 |只看该作者

[转载]常用文件重定向命令

是不是<>是一个类似于>,<之类的符号呢?
请看

  1. /u1/users/carrier/shell>cat <> test_file                        
  2. 1                                                                              
  3. 2                                                                              
  4. 3                                                                              
  5. 4                                                                              
  6. 5                                                                              
  7. u1/users/carrier/shell>cat < > test_file                #有一空格        
  8. ksh: syntax error: `> ' unexpected                                             
  9. u1/users/carrier/shell>
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP