Как создать временные файлы и каталоги shellscript через язык Tcl?
Есть множество способов сделать это, и тот, который я представляю здесь, является одним из них, используя инструмент "mktemp", который уже установлен по умолчанию во многих дистрибутивах Linux.
Временные файлы и каталоги
Инструмент "mktemp" по умолчанию входит в пакет "GNU coreutils" и предназначен исключительно для создания временных файлов / каталогов.
Создание временных файлов и tempdir
Его базовое использование довольно просто. Вызов 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 "$1"> $TEMP
#Read temporary file and list only directories
grep ^d $TEMP
sudo rm -f $TEMP
Обратите внимание, что команда "mktemp" была вызвана в подоболочке (между "- crase"), а ее выходные данные сохранены в переменной "TEMP".
Затем, чтобы файл можно было читать или записывать, просто используйте переменную, где будет имя файла, как это сделано в ls
, grep
а также rm
команды.
Если вам нужно было создать каталоги, как уже было сказано, процесс будет таким же, просто добавим -d
в командную строку mktemp.
#!/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 "$1"> $TEMP
set entry [glob -type f $env(dir) *.jpg]
# Read temporary file and list only directories
puts $entry
Моя самая большая проблема заключалась и остается в создании переменной
# Create a temporary file
exec sh -c "TEMP =`mktemp -d`"
Это не работает!
Может кто-нибудь дать мне бесплатный образец?!
1 ответ
Создание временных файлов можно выполнить с помощью file tempfile
. Для справочниковfile tempdir
будет доступен в Tcl 8.7.
В версиях Tcl до 8.7 вы можете использовать file tempfile
чтобы получить путь к временному расположению и затем создать каталог с этим именем:
set fd [file tempfile temp]
close $fd
file delete $temp
file mkdir $temp
В file tempfile
команда также позволяет указать шаблон, аналогично параметру -p команды 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, а затем использовать их в следующем exec
команда всегда будет терпеть неудачу, потому что эти переменные исчезнут, когда завершится первая подоболочка. Вместо этого сохраните результаты в переменных Tcl, как я сделал выше.
Конечно, вам было бы легче найти каталоги, используя glob -type d
, но я оставил команду оболочки в качестве примера.
Например, создание временного каталога будет таким:
# 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] ;