В последнее время я действительно напортачил. У меня есть функция, которая будет поменять содержимое двух файлов:Где файлы tmp идут после того, как Bash заканчивается «локальной» переменной?
function swap()
{
local TMPFILE=tmp.$$
mv "$1" "$TMPFILE"
mv "$2" "$1"
mv "$TMPFILE""$2"
} ^
Как вы можете видеть прямо рядом, где морковь указывает пространство отсутствует. В результате, выполнив следующую команду:
$ swap important.txt not-important.txt
причина important.txt быть перезаписана не-important.txt и important.txt отправляются в пучину локального переменного Баша/файл
Are есть ли какие-либо варианты, не содержащие царапин на необработанных данных на диске?
$ grep -a -A1000 -B1000 "some text from important.txt" /dev/disk0
Ищите папку/tmp. Немного удачи, у вас ОС есть tmpfiles, например /tmp/tmp.1234, или из вашего сценария, я бы также посмотрел в текущем каталоге, вашем домашнем каталоге, вашем пути, для файлов с именем tmp. * – Pieter21
Чтение ваш сценарий, я предполагал, что TMPFILE = tmp. $$ был некоторым bash, встроенным для tempfiles. Но, по-видимому, он просто помещает «tmp.» в TMPFILE. Поэтому временные файлы должны находиться в каталоге, в котором вы выполнили команду. Плохие новости здесь: если вы использовали swap() несколько раз в том же сеансе оболочки, имя временного файла всегда остается неизменным (и, следовательно, содержимое будет перезаписано в последующих вызовах) ... –
misberner
Для справки в будущем вам нужно 'TMPFILE = $ (mktemp) 'для генерации нового имени файла temp (в'/tmp/', по умолчанию), каждый раз вызывается' swap'.Кроме того, вы хотите только выполнить каждый 'mv', если предыдущий успешно, и (возможно) прервать программу, если какой-либо из них завершится неудачей:' mv '$ 1 "" $ TMPFILE "&& mv" $ 2 "" $ 1 "&& mv" $ TMPFILE "" $ 2 "|| {echo "swap failed"> & 2; выход 1; } '. – chepner