如何通过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
、 grep
和 rm
中所做的那样命令。
如前所述,如果您需要创建目录,过程是相同的,只需在 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] ;
有很多方法可以做到这一点,我在这里展示的就是其中之一,使用许多 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
、 grep
和 rm
中所做的那样命令。
如前所述,如果您需要创建目录,过程是相同的,只需在 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
要回答您更新后的问题,您可以这样做:
# 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] ;