Вы используете i386, это 32 бита. Вы должны использовать 64 бит.
Запуск: apt-get install -f или dpkg --reconfigure
С lsof
man page
Lsof возвращает единицу (1), если обнаружена какая-либо ошибка, включая ошибку для поиска имен команд, имен файлов, адресов Интернета или файлов, входа в систему имена, файлы NFS, PID, PGID или UID, которые было предложено перечислить. Если -V параметр указан, lsof указывает предметы поиска, для которых не удалось выполнить поиск список.
Это означает, что предложение lsof не выполнено по какой-либо другой причине
никогда не будет выполнено.
Пытались ли вы просто переместить файл, пока он все еще открыт внешним процессом? Если каталог назначения находится в той же файловой системе, то проблем с этим не возникнет, если не потребуется доступ к нему по исходному пути из третьего процесса, так как базовый inode останется прежним. В противном случае я думаю, что mv
в любом случае потерпит неудачу.
Если действительно необходимо дождаться завершения внешнего процесса с файлом, лучше использовать команду, которая блокирует, а не повторно опрашивает. В Linux для этого можно использовать inotifywait
. Например:
inotifywait -e close_write /path/to/file
Если вы должны использовать lsof
(возможно, для портативности), вы можете попробовать что-то вроде:
until err_str=$(lsof /path/to/file 2>&1 >/dev/null); do
if [ -n "$err_str" ]; then
# lsof printed an error string, file may or may not be open
echo "lsof: $err_str" >&2
# tricky to decide what to do here, you may want to retry a number of times,
# but for this example just break
break
fi
# lsof returned 1 but didn't print an error string, assume the file is open
sleep 1
done
if [ -z "$err_str" ]; then
# file has been closed, move it
mv /path/to/file /destination/path
fi
Как отмечено в @ JohnWHSmith ниже, наиболее безопасная конструкция всегда будет использовать цикл lsof
, как и выше, так как возможно, что файл будет открыт для записи несколькими процессами (примером может служить плохо написанный демон индексирования, открывающий файлы с флагом чтения/записи, когда он действительно должен быть доступен только для чтения). inotifywait
все еще может использоваться вместо сна, однако, просто замените линию сна на inotifywait -e close/path/to/file
.
Желаемый образец не является регексом, это bash
glob и вам нужен -f
, чтобы сообщить ему, что вы заполняете файлы. Кроме того, вы не хотите, чтобы по умолчанию
для -o
, так как это добавит в только что отфильтрованные имена файлов, либо удалить параметр, либо выбрать что-то другое (я использовал dirnames
, чтобы он также завершил каталоги). Необходимо выполнить следующее задание:
complete -f -o dirnames -X '*.@(aux|pdf)' vim
Соответствующая квота страницы
для используемого glob:
Если опция оболочки extglob включена с помощью shopt builtin, распознается несколько операторов согласования расширенного образца. В следующем описании: pattern-list - это список из одного или нескольких узоров, разделенных |. Составные узоры могут быть сформированы с использованием одного или нескольких из следующих подузоров:
? (список шаблонов) Соответствует нулю или одному вхождению заданных узоров * (список шаблонов) Соответствует нулю или большему количеству вхождений заданных узоров + (список шаблонов) Соответствует одному или нескольким вхождениям заданных узоров @ (шаблон-список) Соответствует одному из заданных узоров ! (список шаблонов)Соответствует чему-либо, кроме одного из заданных узоров
extglob
уже должен быть включен по завершении bash
, но если это не требуется, это также необходимо.