我試圖將文件夾中的所有臨時文件連接到單個文本文件中。但我一直在錯誤運行:將臨時文件連接到tcl中的單個文件
if { [catch { exec cat /tmp/new_temp/* >> /tmp/full_temp.txt } msg] }
錯誤消息:
-cat: /tmp/new_temp/*: No such file or directory
如果我嘗試在tclsh的同樣的事情(不捕,和exec)它的工作原理
我試圖將文件夾中的所有臨時文件連接到單個文本文件中。但我一直在錯誤運行:將臨時文件連接到tcl中的單個文件
if { [catch { exec cat /tmp/new_temp/* >> /tmp/full_temp.txt } msg] }
錯誤消息:
-cat: /tmp/new_temp/*: No such file or directory
如果我嘗試在tclsh的同樣的事情(不捕,和exec)它的工作原理
爲什麼這麼可怕的做法?使用Tcl本身連接這些文件:
set out [open /tmp/full_temp.txt w]
fconfigure $out -translation binary
foreach fname [glob -nocomplain -type f "/tmp/new_temp/*"] {
set in [open $fname]
fconfigure $in -translation binary
fcopy $in $out
close $in
}
close $out
,因爲TCL還是不是shell,它不會自動擴展glob模式。儘量
if { [catch {exec sh -c {cat /tmp/new_temp/* >> /tmp/full_temp.txt}} msg] }
要獲得的Tcl做文件名擴展,你需要的glob
命令
set code [catch [list exec cat {*}[glob /tmp/new_temp/*] >> /tmp/full_temp.txt] msg]
if {$code != 0} {
# handle error
}
第二個示例是錯誤的,因爲它錯過了'cat'本身。我還會強調,這種情況是*罕見的*其中'glob'的默認行爲 - 如果沒有匹配的文件就炸掉 - 實際上是正確的,否則'cat'會試圖從流程中讀取'stdin'。我的意思是,通常將'-nocomplain'傳遞給'glob'是可取的,但這種情況是不同的。 – kostix
哎呀錯過了。我再拍一腳貓 –
+1 fcopy會非常快。 –
glob應該在這裏做的參數是什麼?我收到一個錯誤(/壞參數「-types」:-f) 它似乎工作正常,如果我刪除「-type f」 – egorulz
@egorulz,[它只選擇文件](http: //www.tcl.tk/man/tcl8.4/TclCmd/glob.htm#M10)。否則,你需要在每個匹配條目上執行'file stat',看看它是否真的是一個文件,而不是一個目錄或套接字或fifo。這是必需的,因爲試圖對一個目錄執行fcopy操作會失敗並出現錯誤,並嘗試使用套接字或fifo執行此操作可能只是嘗試從它們讀取數據,而這些數據本來就是錯誤的)。請注意,您使用'cat'的原始嘗試很容易出現同樣的問題。 – kostix