如何通过Tcl语言创建临时的shellscript文件和目录?

How to create temporary shellscript files and directories through Tcl language?

有很多方法可以做到这一点,我在这里展示的就是其中之一,使用许多 Linux 发行版中默认安装的“mktemp”工具。

临时文件和目录

默认情况下,“mktemp”工具包含在“GNU coreutils”包中,其目的只是为了创建临时文件 files/directories。

正在创建临时文件和临时目录

它的基本使用非常简单。从不带任何参数的命令行调用 'mktemp' 将在磁盘上的 /tmp 内创建一个文件,其名称将显示在屏幕上。看:

$ mktemp
/tmp/tmp.JVeOizVlqk

创建目录就像在命令行中添加“-d”参数一样简单。

$ mktemp -d
/tmp/tmp.sBihXbcmKa

在实践中使用

实际上,屏幕上显示的临时文件或目录名没有用。它必须存储在一个可以在任何时候访问的变量中,在处理过程中可以读取或写入。

在下面的示例中有一个小脚本,顺便说一下,它没有用,但它向我们展示了一个合适的逐步步骤。看:

#!/bin/sh
#
#Create a temporary file
TEMP = `mktemp`
#Save all the content of the entered path
ls -l ""> $TEMP
#Read temporary file and list only directories
grep ^d $TEMP
sudo rm -f $TEMP

请注意,命令“mktemp”在子shell(在“-crase”之间)中调用,其输出存储在变量“TEMP”中。

然后,为了可以读取或写入文件,只需使用变量,其中有文件名,如 ls greprm 中所做的那样命令。

如前所述,如果您需要创建目录,过程是相同的,只需在 mktemp 命令行中添加一个 -d

#!/bin/sh
#
TEMP = `mktemp -d`
cd $TEMP
.
.
.
sudo rm -rf $TEMP

如果要创建很多临时文件,我们使用“-p”参数指定应创建文件的路径。

#!/bin/sh
#
TEMP = `mktemp -d`
cd $TEMP
FILE1 = `mktemp -p $TEMP`
.
.
.
sudo rm -f $FILE1
sudo rm -rf $TEMP

仅此而已。您的脚本现在可以更专业地使用临时文件。

但是,我想用 tclsh 而不是 sh [bourn shell .. 但我做了几次尝试,但没有任何效果。这是我尝试过的示例:

 # Create a temporary file
 exec sh -c "TEMP =`mktemp -d`"

 set dir [cd $TEMP]

 # Save all content from the entered path
 exec ls -l ""> $TEMP

 set entry [glob -type f $env(dir) *.jpg]

 # Read temporary file and list only directories
 puts $entry

My biggest problem was and is in creating the variable

# Create a temporary file
 exec sh -c "TEMP =`mktemp -d`"

这是行不通的!

有人可以给我免费样品吗?!

可以使用 file tempfile 创建临时文件。对于目录 file tempdir 将在 Tcl 8.7 中可用。

在 8.7 之前的 Tcl 版本中,您可以使用 file tempfile 获取临时位置的路径,然后使用该名称创建目录:

set fd [file tempfile temp]
close $fd
file delete $temp
file mkdir $temp

file tempfile命令也可以指定模板,类似于mktemp

的-p选项

要回答您更新后的问题,您可以这样做:

# Create a temporary file
set temp [exec mktemp]
# Save all content from the entered path
exec ls -l [lindex $argv 0] > $temp
# Read temporary file
set f [open $temp]
set lines [split [read $f] \n]
close $f
# List only directories
puts [join [lsearch -all -inline $lines {d*}] \n]

我忽略了你混淆目录和常规文件以及 *.jpg 应该是什么的问题。

您尝试从 Tcl 内部创建 shell 变量,然后在下一个 exec 命令中使用这些变量将始终失败,因为当第一个 subshell 终止时,这些变量就消失了。将结果保存在 Tcl 变量中,就像我上面所做的那样。

当然,您可以使用 glob -type d 更轻松地找到目录,但我保留了 shell 命令作为示例。


以临时目录的创建为例:

# Create a temporary directory
set dir [exec mktemp -d] ; 

# Now, files insert in directory 
# (In this example I am decompressing a ZIP file and only JPEG format images)
exec unzip -x $env(HOME)/file.zip *.jpg -d $dir ; 

# Look the directory now with this command:
puts [glob -nocomplain -type f -directory $dir -tails *.jpg] ;