LINUX.ORG.RU

Переместить и tmp, может ли возникать ошибка?

 ,


0

1

Здравствуйте.

Подскажите, пожалуйста, есть у меня две строки в скрипте, удаляют лишнее из файла. Всё вроде работает как надо, но иногда ловлю ошибку. Вот такую

mv: cannot stat 'tmp': No such file or directory

строчки

grep -v -f file1 file2 > tmp ; mv -f tmp file2
grep -v -f file3 file2 > tmp ; mv -f tmp file2

Может быть причиной, то что tmp еще «занят», но начинается выполнение второй строки? Спасет ли добавление строки со sleep?

Спасибо.


Что гадать, отлаживай. Закомментируй вторую строку. Ощибка осталась? tmp вообще создается?

andytux ★★★★★
()
Ответ на: комментарий от andytux

в том то и дело, ошибка то есть то нет, не могу понять в этом ли дело, решил вот узнать, может кто сталкивался

xohox
() автор топика
Ответ на: комментарий от mord0d

ну оно ж работает, хотел уйти от еще одного файла, чтоб записывалось в исходный

подскажете, как можно и удалить и исходный файл оставить?

xohox
() автор топика
Ответ на: комментарий от xohox

ну оно ж работает

ошибка то есть то нет

Так работает, или нет? Ты уж определись!


Рекомендую использовать логику. И не экономить на спичках в виде жонглирования файлами. Ну и если у тебя паттерн обоих грепов один, то юзать cat всех файлов разом, и уже выхлоп грепать.

mord0d ★★★★★
()

(grep -v -f file1 file2 > tmp && mv -f tmp file2) || echo “grep error”

skyman ★★★
()
Ответ на: комментарий от xohox

Объясняю на пальцах.

Допустим, существует файл /a/file1. Ты находишься в каталоге / - file1 No such file. Ты в каталоге /b - file1 No such file. Единственный вариант, когда file1 будет найден - ты в каталоге /a.

andytux ★★★★★
()
Ответ на: комментарий от andytux

Дополнение, ошибка появляется когда tmp пустой. Когда ничего не найдено, тогда tmp остается в каталоге.

добавил к строке

& rm tmp

при запуске стало отображаться вот это

[1]+  Exit 1

видимо дело в том, что «следующей строке» просто не удается создать новый tmp и работать с ним, но это не точно)

xohox
() автор топика
Последнее исправление: xohox (всего исправлений: 1)
Ответ на: комментарий от xohox

То что я пытаюсь тебе объяснить, одна из точек отказа, далеко не единственная. Смотрим «ширше». Запускаешь скрипт не из того каталога, в котором file1, file2. Следовательно они не будут найдены - No such file. Где в этом случае будет создан файл tmp, вообще однозначно ответить невозможно, но вероятно будет пустой.

andytux ★★★★★
()

Я не вижу, где в этих строках может быть такая ошибка. В таком виде должно работать. Возможно, есть различия с оригинальными кодом.

xaizek ★★★★★
()

если grep ничего не выводит - то в файл ничего не записано и файл не создан

поэтому mv не может переместить несуществующий файл

slowpony ★★★★★
()
Ответ на: комментарий от slowpony

если grep ничего не выводит - то в файл ничего не записано и файл не создан

Брешешь. При перенаправлении вывода > tmp файл tmp создаётся шеллом ещё до старта самой программы.

debugger ★★★★★
()

Имя tmp для временного файла неудачное. У тебя параллельно с этим какие-нибудь другие твои скрипты не работают, которые могли бы создавать и удалять файлы с таким же оригинальным именем tmp?

Я бы начал с этого:

#!/bin/bash  
set -eo pipefail
my_grep() {
    local rc=0
    grep "$@" || rc=$?
    if [[ $rc -gt 1 ]]; then
        echo "grep failed!" >&2 
        exit $rc
    fi
}   
file="..." # твой file2
temp=$( mktemp )
cat "$file" | my_grep ... | my_grep ... > "$temp"
mv "$temp" "$file"
debugger ★★★★★
()
Ответ на: комментарий от xohox

ошибок никаких не выдает, но и tmp не удаляет

Да ты вообще тёмный. Срочно man grep, man bash (смотри что значит &&).

И приводить надо фрагмент того кода, который не работает, а не вариации на тему.

debugger ★★★★★
()
Ответ на: комментарий от debugger

У тебя параллельно с этим какие-нибудь другие твои скрипты не работают, которые могли бы создавать и удалять файлы с таким же оригинальным именем tmp?

Да, есть.

xohox
() автор топика
Ответ на: комментарий от debugger

Вот и возможный источник проблемы. man mktemp.

Понял, спасибо. Проверю.

xohox
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.