"Cannot reallocate" when create file?

Я не уверен, как ОС Raspbian обрабатывает несколько выходных данных, но я предполагаю, что она использует текущую распространенную практику, которая заключается в использовании Xinerama, т.е. несколько экранов используются одним и тем же «дисплеем». "(в терминах X11). В таком случае вы в принципе не можете «выбрать выходной порт» — все выходы находятся на одном дисплее (вы можете думать об этом как о виртуальном экране, который охватывает все ваши экраны и, возможно, больше).

Чтобы настроить таргетинг на определенный «экран» (термин X11, что означает часть дисплея), вам нужно запросить у X-сервера, какая часть дисплея отображается на нужный вам экран, а затем заставить VLC отобразить в ту область.Стандартный способ сделать это — использовать флаг --geometry, который приложение должно распознавать и принимать в особом формате, который выглядит следующим образом: <ширина>X<высота>+ + - который (кстати, не) является точным форматом, в котором инструмент запросов X-сервера отображает эту информацию - запустите xrandr и посмотрите.

К сожалению, VLC не принимает такой параметр — он должен быть другим. Вместо этого он использует 4 разных параметра: --width, --height, --video-x и --video-y. ].

Итак, вот короткий скрипт, который использует xrandr для получения геометрии первого подключенного порта HDMI (у меня их несколько, так что это полезно), а затем разбивает спецификацию геометрии из xrandr для запуска VLC с правильными параметрами:

geom=( $(xrandr | grep ' connected' | grep HDMI | head -n1 | cut -d' ' -f3 | tr 'x+' '  ') ); \
  [ -n "${geom[*]}" ] && vlc \
    --width=${geom[0]} --height=${geom[1]} \
    --video-x=${geom[2]} --video-y=${geom[3]} \
    my-video.mp4

(отформатировано в несколько строк с обратной косой чертой для удобочитаемости, это должно быть в одной строке, но и так будет работать нормально — с обратной косой чертой).

[Обновление]: Теперь, когда я перечитал ваш вопрос, мне кажется, что вы можете иметь в виду, что хотите запустить свой скрипт вне сеанса X-сервера, и в этом случае вам также необходимо правильно настройте переменную окружения DISPLAY. Поэтому попробуйте установить DISPLAY перед запуском VLC, запустив export DISPLAY=:0.

1
09.01.2017, 00:36
1 ответ

Просто несколько вещей об этом сценарии, не обращая внимания на то, что это сценарий оболочки, работающий с XML.

  1. Он читает каждый файл в память.
  2. Он использует некоторые конструкции, которые являются "плохой практикой".

Давайте это исправим.

  • Во-первых, каждая команда не должна заканчиваться символами ;. ; используется, если вы помещаете несколько команд в одну строку, например ls; echo "hello".

  • Расширения переменных всегда должны заключаться в двойные кавычки. См. "Последствия для безопасности, если забыть заключить переменную в кавычки в оболочках bash/POSIX". Например: Ext="$1", XMLHeader >"$OutPutFileName", и т.д.

  • for Vfile in $(ls | grep .$Ext) лучше написать for Vfile in ./*."$Ext".

  • Вместо того чтобы делать несколько перенаправлений в цикле, все из которых добавляются в один и тот же файл, завершите цикл словами done >>"$OutPutFileName". Это более эффективно.

  • VarRow=`cat $Vfile` поместит содержимое файла размером 85 Мб в одну переменную, а затем for Row in $(echo $VarRow ) будет перебирать строки, или вы на это надеетесь. Вместо этого сделайте while IFS= read -r Row; do ... done <"$Vfile". При этом будет считываться по строке за раз. Вместо того чтобы хранить весь файл, вы можете хранить только строку за раз. Возможно, именно здесь вы столкнетесь с проблемами памяти.

  • Вместо VarCell=`echo $VarRow` с последующим for Cell in $(echo $VarCell | sed "s/,/ / /g"), просто сделайте VarCell="${VarRow//,/ }" с последующим for Cell in $VarCell (это кажется немного сомнительным, переменная без кавычек, содержащая входные данные, предложения по улучшению приветствуются)

  • Любой echo, который выводит данные переменной, я бы заменил на printf со строкой формата с одинарными кавычками, за которой следуют расширения переменной с двойными кавычками. Например: echo "

    " меняется на printf '
    \n' "$VFile". См. раздел "Почему printf лучше, чем echo?".

  • Когда вы хотите вывести длинную строку (несколько строк), используйте here-документ. Так вам дополнительно не придется беспокоиться об экранировании кавычек.

  • 0
    28.01.2020, 01:31

    Теги

    Похожие вопросы