LINUX.ORG.RU

Сообщения Desmond_Hume

 

Скрипт летит по коду без остановок на wait $pid

Есть такой код (как пример):

#!/usr/bin/env bash
set -x
gnome-terminal -- watch -n 3 df -h &
pid_gnome_watch=$!
echo $pid_gnome_watch
wait $pid_gnome_watch
kill $pid_gnome_watch
echo "It's done!"
ls
set +x

При запуске, выдает такие логи (установил set +- для отладки):

+ set +x
$ ./wait_test.sh 
+ pid_gnome_watch=33410
+ echo 33410
33410
+ wait 33410
+ gnome-terminal -- df -h
+ kill 33410
./wait_test.sh: line 7: kill: (33410) - No such process
+ echo 'It'\''s done!'
It's done!
+ ls
[СПИСОК ФАЙЛОВ]
+ set +x

Wait не держит выполнение скрипта до завершения процесса. Команды выполняются одна за другой без какой-либо задержки. Мне нужно, чтобы выполнение скрипта приостановилось дальше, пока не завершится команда gnome-terminal -- watch -n 3 df -h - с любым статусом, хоть true, хоть false или ещё как-то, лишь бы скрипт ожидал завершения этой команды и гнал уже дальше.

Почему не срабатывает wait?

P.S. Пробовал разные лайфхаки с &&, true … не помогло.

Решение:

#!/usr/bin/env bash

gnome-terminal --wait -- watch -n 3 df -h

[ЛЮБОЙ КОД ДАЛЬШЕ - не выполняется до тех пор, пока команда выше не завершится чем-то]

 , ,

Desmond_Hume
()

Неопределённость с Github

Учитывая нынешние реалии с санкциями в отношении русскоязычных пользователей на зарубежных ресурсах, как вообще сейчас работает github в отношении разработчиков, которые пишут на русском языке, преимущественно, при оформлении своей личной страницы на github? Сам не знаю, банят там или нет за кириллицу, но хотелось бы оформить там пару любительских проектиков, ориентированных строго на русскоязычных пользователей.

Имеет ли смысл регистрироваться и публиковать код, или лучше искать другие какие-то альтернативы? А если, всё же, альтернативы, то какие?

Может кто что посоветует … будет интересно услышать о вашем личном опыте с гитхабом, в контексте русскоязычности контента на личной странице в гитхабе.

 , ,

Desmond_Hume
()

Борьба с кодировками продолжается ... Кракозябры и компания.

Есть необходимость периодически конвертировать текстовые файлы для просмотра в шиндусе и в лине. Конкретно в 1С, которая понимает только CP1251 (ISO-8859-1 тоже, наверное, не суть), который выглядит в Ubuntu по-кракозябрински. При помощи команды iconv -f CP1251 -t UTF-8 (и наоборот) всё это дело прекрасно конвертируется. Но есть нюанс: если вдруг откроешь в Ubuntu файл в любом текстовом редакторе и внесёшь в кракозябринский документ запись на обычной кириллице и сохранишь, команда перестаёт конвертировать, ссылаясь на «illegal input sequence at position» - на позиции как раз там, где я добавил на русском (кириллице) строчку.

На практике вряд ли вообще такое пригодится - вносить изменения. Обычно документы туда-сюда ходят без таких изменений. Я этот досадный эффект обнаружил случайно (наверное, где-то внутри во мне живёт талантливый тестировщик). Вполне возможно, мне не понадобится таким заниматься, то есть вносить изменения в документы. Но вдруг … просто предположим.

Есть какой-то способ конвертировать такой «киш-миш» кодировок в одном документе так, чтобы не было ошибок типа «illegal input … at position»?

Как пример, есть такой вот текст:

Ïðîâåðêà ôàéëà
Проверка файла

Позиция строк и их порядок может быть любой, не обязательно, что на 1 строке такая кодировка, а на 2-ой - вторая. То есть, заранее мы, как будто, знать не можем (например, забыли, что вносили изменения или внёс изменения кто-то другой).

Решение найдено тут

 , ,

Desmond_Hume
()

Команда cut в bash

Недавно узнал, что команды:

сut -d. -f1

и

cut -d "." -f 1

равнозначны. Результат выполнения будет одинаковым, без всяких ошибок.

Для меня лично это было открытием, потому что я привык к тому, что пробел ставится после любой опции, если там один дефис. Например,

# command --option="value", если двойной дефис
command -o "value"

Даже в мыслях не предполагал, что может быть запись типа

command -ovalue

Это некое исключение в bash или это нормальный синтаксис для всех команд? Какие ещё подобные исключения вы можете привести, где после опции с одним дефисом не стоит пробел и сразу идёт значение опции?

И второй вопрос: к какому варианту в cut лучше привыкнуть сразу? К первому или второму? ИИ спрашивал, рекомендует вариант с пробелами (и кавычками, обязательно), но пишет, что оба варианта дадут одинаковые результаты выполнения и взаимозаменяемы.

 , , ,

Desmond_Hume
()

Расположение yad и zenity на экране

Сейчас делаю GUI к своему скрипту и столкнулся с неприятной эстетической проблемой - окно, которое создаёт yad или zenity, всегда в левом верхнем углу, как бы я его не двигал во время работы скрипта, при последующем запуске - всё равно окошко появляется в левом верхнем углу. Возможно ли как-то сделать так, чтобы оно всегда открывалось по центру экрана или в том месте, где было закрыто?

Решение найдено тут

 , , ,

Desmond_Hume
()

Декларация функции в bash

Столкнулся со странностью недавно. Везде в интернетах пишут, что функцию в bash можно объявить разными способами, в том числе при помощи ключевого слова function перед названием функции. Именно такой способ мне больше всего нравится, и я решил им воспользоваться. Однако, не сработало.

Долго рылся в гугле, где-то видел пометку, что якобы function работает не во всех средах и т.п. Но это звучит как-то странно. Неужели в Ubuntu какая-то особая среда и т.п. Это ведь обычный дистрибутив Linux, один из самых популярных. Чего там может быть «особого»?

Например,


filetype_is1 () {
			echo $(file "$a" |  cut -d ":" -f 2 | cut -d " " -f 2)	
		}

— сработало замечательно.

А вот так,

function filetype_is1 {
....
}

— вызвало ошибку (ссылка на неправильно поставленные скобки, что-то такое …).

Вопрос: у всех так? Почему первый способ работает, а второй - нет? Может подскажете ресурс, где хорошо объясняется эта тема? Перелопатил разных сайтов (англоязычных, естественно) штук 7-8. Вроде всё понятно объясняется, но не работает. Может действительно в bash это ключевое слово уже не используется, или что?

 , ,

Desmond_Hume
()

Пакетная обработка видеофайлов с помощью ffmpeg. Что-то идёт не так ...

Есть коллекция видеофайлов из 1023 штук. Все лежат в одной папке. У меня такая вот задача: сделать скриншот на 7 секунде из каждого файла и поместить их в папку folder, которая лежит в той же папке, где хранятся эти видеофайлы. Пробовал решить задачу двумя способами. Точнее одним, а на втором экспериментировал, экспериментировал, но так удобоваримого результата не получил.
Первый вариант сделан в стиле python-zen, то есть я по максимуму сделал упрощение, примитивизировал решение, поделил его на кучу «простых» задач.
Во втором варианте, я решил немного поиграть в кулхацкера и замахнулся даже на владение приёмами regex. Получилось краткое решение, мне оно нравится, почему-то. Люблю краткость. Но вот незадача, почему-то скрипт работает менее эффективно. То есть, вместо 1023 штук скриншотов он делает 900 штук.
В общем-то, такой вариант меня бы тоже устроил, но хотелось бы понять, в чём моя ошибка. Может быть я с синтаксисом намудрил? Переборщил с regex? Первый вариант работает на ура, делает 1015 штук - меня это устраивает вполне.
То, что ни тот, ни другой вариант не делает все 1023 штуки скриншотов - меня устраивает, потому что некоторые скрины, судя по логам, цепляются с какими-то ошибками и отказами и т.п., то есть ffmpeg «решает» их пропускать. Это не проблема.
Проверьте, пожалуйста, второй вариант. Может быть, незамыленный глаз увидит лучше.

Вариант №1

#!/bin/bash

# Папка для сохранения превьюшек должна находится в той же папке, в которой находятся видеофайлы!!
# Статья, где я взял команду по ffmpeg находится здесь: https://annimon.com/article/4008
folder_to_save="folder"

# 1. Находим скриншоты для mp4-файлов
for file in *.mp4; do
	ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.mp4}_${RANDOM}.jpeg"
done

# 2. Находим скриншоты для avi-файлов
for file in *.avi; do
	ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.avi}_${RANDOM}.jpeg"
done

# 3. Находим скриншоты для rmvb-файлов
for file in *.rmvb; do
	ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.rmvb}_${RANDOM}.jpeg"
done

# 4. Находим скриншоты для 3gp-файлов
for file in *.3gp; do
	ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.3gp}_${RANDOM}.jpeg"
done

# 5. Находим скриншоты для mov-файлов
for file in *.mov; do
	ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.mov}_${RANDOM}.jpeg"
done

# 6. Находим скриншоты для mpg-файлов
for file in *.mpg; do
	ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.mpg}_${RANDOM}.jpeg"
done

# 7. Находим скриншоты для flv-файлов
for file in *.flv; do
	ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.flv}_${RANDOM}.jpeg"
done

# 8. Находим скриншоты для mkv-файлов
for file in *.mkv; do
	ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.mkv}_${RANDOM}.jpeg"
done

# 9. Находим скриншоты для mpeg-файлов
for file in *.mpeg; do
	ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.mpeg}_${RANDOM}.jpeg"
done

# 10. Находим скриншоты для mp-файлов
for file in *.mp; do
	ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.mp}_${RANDOM}.jpeg"
done

# 11. Находим скриншоты для wmv-файлов
for file in *.wmv; do
	ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "${folder_to_save}/${file%.wmv}_${RANDOM}.jpeg"
done

Вариант №2

#!/bin/bash

# Упрощённый вариант (получилось всего 900 картинок, а надо было 1023)
for file in {*.mp4,*.avi,*.rmvb,*.3gp,*.mov,*.mpg,*.flv,*.mkv,*.mpeg,*.mp,*.wmv}; do
	ffmpeg -i "${file}" -ss 00:00:07 -frames:v 1 "folder/${file%.[mp4,avi,rmvb,3gp,mov,mpg,flv,mkv,mpeg,mp,wmv]}_${RANDOM}.jpeg"
done

Перемещено hobbit из general

 , ,

Desmond_Hume
()

Откуда такой синтаксис в Bash: 1> и 0<

В интернетах пишут, что разницы между 1> и >, а также между 0< и <, нет никакой. По факту выполнения команд - так и есть. Но какой из них более правильный?
И вообще, почему писали раньше так, а теперь так?
Если это так «модно», то есть ещё подобные аналоги команд, которые были сокращены со временем?

 

Desmond_Hume
()

Необычное поведение crontab и cron

Имеется такой вот скрипт, для теста:

#!/usr/bin/bash

notify-send "Hi there!"

Давно не пользовался cron. Как-то не сложилась у меня с ним судьба — уже создавал когда-то тему с подобной проблемой, но так и не отложилась логика поведения, нет чёткого понимания до сих пор. Есть вещи, которые понятны как дважды-два, а есть … как кот Шрёдингера — то ли живым считать, то ли мёртвым, не поймёшь: ведь, по идее, он мёртв, потому что живой, когда умер, будучи ещё живым.

Если бы не старая тема, бился бы ещё долго головой об интернет, чтобы понять, в чём проблема. Хорошо, понятно, что нужно было добавить глобальную переменную $DISPLAY в cron-запись:

50 11 * * * DISPLAY=:0 /home/pushistiq/Desktop/my-cron.job

Без этой переменной, скрипт не отрабатывается, уведомление «Hi there!» не появляется. Это первая странность, которую я хотя бы как-то могу ещё объяснить тем, что, якобы, скрипт запускается от другого пользователя, с другим графическим окружением, несмотря на то, что и пользователя указывал:

50 11 * * * pushistiq /home/pushistiq/Desktop/my-cron.job)

— так тоже не работает, пока не добавишь DISPLAY. Пришла мысль: а может под текущим пользователем другой $DISPLAY? Но нет, если в терминале набрать команду «echo $DISPLAY» - показывает тот же :0

Это первая странность.

Вторая странность. Разный внешний вид уведомлений. Если запускать скрипт из терминала, то появляется уведомление вверху посередине такого вида. А если срабатывает cron (c указанием DISPLAY, естественно), то уведомление появляется такого вида с правого края экрана.

Почему это всё странно? Потому что куча страниц по настройке cron через crontab заявляют, что всё работает без DISPLAY. Я ни одного руководства не увидел с указанием DISPLAY. Может это только для уведомлений? Не знаю. Но всё это так неочевидно. Да ещё этот разный вид уведомлений … мистика.

 , ,

Desmond_Hume
()

Минимальный элемент не минимальный ... или ...

Всем привет! Хеллоуворлдинг продолжается. Привёз вам вот такой код на разбор:

test_list = ["test", "together", "plus", "four", "ranger", "twelve", "sun", 'two']
print(min(test_list))

Результатом выполнения скрипта будет «four»

Странно? Хорошо, поменяем элементы. Может с «two» не заладилось. Выполняю следующее:

test_list = ["train", "tor", "plus", "five", "rangers", "fourteen", "sun", "one"]
print(min(test_list))

И получаю результат … «five».

Я понимаю, что на тексте пробовать функцию, которая скорее всего предполагалась для чисел, это некоторое извращение, но хотелось понять бы принцип, по которому выбирается в первом случае «four», а во втором «five» (почему не, например, «two» или, во втором случае, «one»??). Есть догадки?

 , ,

Desmond_Hume
()

Модуль sys странно себя ведёт

У меня Ubuntu 22.04. Выполняю в консоли такой вот код:

import sys
sys.stdout.write('Hello')

Получаю результат «Hello5». Откуда эта «5» на конце берётся? Это нормально или баг?

 , , ,

Desmond_Hume
()

Эмуляция печати с помощью модуля keyboard в Python

Ковыряю тут модуль keyboard, в надежде создать какой-нибудь хеллоуворлдный доступный для понимания новичку скрипт, который бы печатал символ одинарных кавычек, чтобы потом его повесить на горячую клавишу. Создал скрипт такого содержания:

#!/usr/bin/python

import keyboard
keyboard.write("''", delay=0.04)

Работает он неплохо, правда задержка как-то не радует. Вы, наверное, спросите, зачем я сделал два раза cимвол ’ — дело в том, что с одним этот код не работает. Он ничего не печатает. Только при добавлении второй ’, и указании задержки в 0.04 - печатается один (!!) символ ’. Всё это выяснил случайно, эмпирическим методом (регулировал задержку сначала, а потом добавил ещё один символ ’ - а вдруг сработает? и сработало! но не так, как хотелось бы).

Вопрос в следующем: что в моём коде не так и почему этот модуль работает так неочевидно, хотя казалось бы, запросы довольно просты, я не делаю какую-то сверхзадачу. И да, если не напечатать два раза ’ ’, никакое значение задержки не решит задачу. Будет печататься пустота. То есть, дело не совсем в задержке … а в чём?

 ,

Desmond_Hume
()

Авторизации на сайтах слетают при перезапуске Firefox

Когда закрываю Firefox, все авторизации вылетают: снова авторизовываться на youtube, linux.org.ru, google и проч. В Google Chrome такой проблемы нет - открываешь и сразу получаешь сайты в авторизованном виде. Где что включить, не пойму? Уже давно не пользовался Firefox.

 

Desmond_Hume
()

На ноутбуке MSI GS73VR 7RG одновременный вывод звука и глюки с регулировкой звука

Обнаружил следующие проблемы на этом ноуте:

  1. Одновременный вывод звука

    Подключаю наушники обычные проводные - звук идёт и в наушниках, и из динамиков ноутбука.

  2. Регулировка звука

    Звук идёт из динамиков. Подключаю наушники - звук сбрасывается на 0, начинаю добавлять до 1% звук появляется, добавлю ещё - звук не меняется, и только когда добавлю до 100% звук обычный становится, с 1 до 100% изменений звука не происходит, если регулировать звук.

Настройки звука выглядят вот так. Такое ощущение, что не хватает драйверов для корректной работы .. Но на сайте производителя нет драйверов для звука под Linux.

Были ли у кого проблемы со звуком в данной модели ноутбука? Как решили?

 , , , ,

Desmond_Hume
()

Не работает звук выбранного уведомления в Lightning Calendar

Выставил тут звук уведомления в формате wav. Уведомление выходит, но звука нет. Пробовал и mp3 — то же самое.

Кто как решал? Обшерстил все заморские форумы, но наводок не обнаружил.

 , , ,

Desmond_Hume
()

Лаги после пауз при воспроизведении видеофайлов в SMPlayer

При просмотре видео в SMPlayer, когда ставлю на паузу, а затем продолжаю просмотр, замечаю микрозадержки. Кадр будто фризится на микросекунду, потом снова нормально — и так раз 5-7, а потом всё нормально воспроизводится. Затем ещё раз ставлю на паузу — и всё повторяется снова.
Долго искал причину методом научного тыка, не мог обнаружить. Полез на форумы, оказывается из-за pulse в настройках аудиодрайвера в медиаплеере. Поменял на alsa и всё стало нормально.
Может кто-то знает, как заставить работать pulse не хуже alsa? Ведь это дефолтная настройка SMPlayer, видимо, разработчики считают, что pulse нормален, раз не меняют его на дефолтную alsa.

 , , ,

Desmond_Hume
()

Автоматическое включение NumLock при загрузке Ubuntu

Система установлена на зашифрованный диск (LUKS). В сеансе Gnome - это решается утилитой numlockx. Но до загрузки графической части, на этапе ввода пароля LUKS NumLock всегда отключён. Как сделать так, чтобы он был включён постоянно? Подозреваю, что рыться надо где-то в районе grub …

Решение нашёл тут

 , ,

Desmond_Hume
()

Не слишком ли много предсказывает Ричард Столлман?

Помните как все ржали над RMS, когда он говорил про «швободу» и проч.? А ведь он в очередной раз оказался прав … события с Трампом доказали лишний раз. YouTube, Google, Twitter - не прошли проверку на вшивость. Будущее за децентрализованными сервисами. В каком-то лохматом году, помню, слушал интервью с Ричардом Столлманом и мысли были такие, типа, «ну, дядька совсем уже в фольгу готов зарыться … а зачем? мир ведь открыт и свободен и так!»

 , , , ,

Desmond_Hume
()

Не видно USB 3.0 устройства в Virt-Manager (KVM)

В виртуальной винде (7) не могу увидеть содержимое флешки 3.0, хотя флешки 2.0 отлично читаются ей через встроенный в virt-manager usb-фильтр. Порты usb перебрасывал, добавлял usb 3.0 … ничего не помогает. Естественно, флешка подключается к USB 3.0 порту ноутбука и отображается в основной ОС без проблем. Работаю в связке «xubuntu 20.04(host)-win7(guest)».

В чём может быть проблема?

 , , ,

Desmond_Hume
()

Запуск процессов под другими пользователями

Есть два пользователя в Linux Mint: user1 и user2. Работа основная ведётся под user1, Syncthing настроен на user2. Как запустить Syncthing под пользователем user2, работая в user1, без переключения пользвателей, в сессии user1?

 , ,

Desmond_Hume
()

RSS подписка на новые темы