xargs - добавить каждый аргумент параметром

Да, узнал! Чтобы активировать ВИРТУАЛЬНЫЙ вывод драйвера Intel, вам необходимо создать файл 20-intel.conf в каталоге конфигурации Xorg ( / usr / share / X11 / xorg.conf.d в Debian stretch, обнаруженный при чтении /var/log/Xorg.0.log )

Section "Device"
    Identifier "intelgpu0"
    Driver "intel"
    Option "VirtualHeads" "2"
EndSection

Мой /etc/bumblebee/xorg.conf.nvidia выглядит следующим образом :

Section "ServerLayout"
    Identifier  "Layout0"
    Option      "AutoAddDevices" "true"
    Option      "AutoAddGPU" "false"
EndSection

Section "Device"
    Identifier  "DiscreteNvidia"
    Driver      "nvidia"
    VendorName  "NVIDIA Corporation"
    Option "ProbeAllGpus" "false"
    Option "NoLogo" "true"
    Option "AllowEmptyInitialConfiguration"
EndSection

Section "Screen"
    Identifier "Screen0"
    Device "DiscreteNVidia"
EndSection

Некоторые пояснения: ему нужен раздел «Экран», иначе он пытается использовать устройство Intel, объявленное в 20-intel.conf (которое мы только что добавили ранее, о боже ...). Ему также требуется «AllowEmptyInitialConfiguration», чтобы иметь возможность запускаться с optirun, когда внешний монитор не подключен.

С этой конфигурацией и запуском intel-virtual-output я смог получить доступ к моему порту HDMI. Ага !!!

Устранение неполадок: если optirun или intel-virtual-output не работают, просмотрите /var/log/Xorg.8.log (шмель создает X-сервер с внутренним отображением display: 8).

Примечания Я читал в нескольких местах, что KeepUnusedXServer должен быть установлен на true и PMMethod на none в ] /etc/bumblebee/bumblebee.conf , я этого не делал, и все работает нормально. Если я это сделаю, это сработает, но тогда дискретный графический процессор останется включенным даже после выхода из приложения optirun-ed или отключения intel-virtual-output, чего я не хотел.

Дополнительные примечания Еще кое-что, из-за чего я ударился головой об стену, было отключение Nouveau и запуск сервера Intel X: это нужно делать с помощью флагов, переданных ядру, указанных в параметрах GRUB. В / etc / defaults / grub у меня есть следующая строка:

GRUB_CMDLINE_LINUX_DEFAULT="quiet blacklist.nouveau=1 i915.modeset=1 gfxpayload=640x480 acpi_backlight=vendor acpi_osi=! acpi_osi=\"Windows 2009\""

(остерегайтесь кавычек и экранированных кавычек).

Некоторые пояснения: он избегает загрузки nouveau (что несовместимо с сервером Nvidia X) и указывает драйверу Intel перейти в графический режим прямо во время загрузки. Если вы этого не сделаете, то сервер Intel X не сможет запуститься, и он вернется к обычному старому серверу VESA с 3D-рендерингом на стороне процессора. Флаги acpi_xxx требуются на этой конкретной машине для устранения ошибки BIOS, которая приводит к сбою при переходе в графический режим с отключенным дискретным графическим процессором. Обратите внимание, что он специфичен для данного конкретного ноутбука (портативной рабочей станции HP ZBook), он может быть ненужным или отличаться для других ноутбуков.

Обновление (6 декабря 2017 г.) В последней версии дистрибутива Debian (Buster) "915.modeset = 1 gfxpayload = 640x480" не требуется. Чтобы удалить nouveau, мне также нужно было создать файл nouveau.conf в /etc/modprobe.d с «blacklist nouveau» в нем, а затем воссоздать ramdisk с помощью «update-initramfs -u». Перезагрузитесь и убедитесь, что «nouveau» больше не загружается с помощью «lsmod | grep nouveau».

Обновление (17 декабря 2016 г.) В последней версии xorg-server (1.19), похоже, есть проблема в функции RandR, которая управляет гаммой при использовании с intel-virtual-output . Вот процедура, чтобы исправить Xserver и заставить его работать:

sudo apt-get build-dep xserver-xorg-core
apt-get source xorg-server

отредактируйте hw / xfree86 / mode / xg86RandR12.c Строка 1260, вставьте "return" (чтобы функция xf86RandR12CrtcComputeGamma () ничего не делала)

dpkg-buildpackage -rfakeroot -us -uc
cd ..
sudo dpkg -i xserver-xorg-core_n.nn.n-n_amd64.deb

(замените n.nn.nn с правильной версией), перезагрузитесь и Ага !! снова работает! (но это быстрое и грязное исправление)

Обновление отправило отчет об ошибке (уже известной и только что исправленной): https: //bugs.freedesktop. org / show_bug.cgi? id = 99129

Как я понял: Установил xserver-xorg-core-dbg и сделал gdb / usr / lib / xorg / Xorg с другой машины через ssh.

Обновление (11 января 17) Похоже, что ошибка исправлена ​​в последних пакетах Debian.

Обновление (24 января 18) Если вы хотите подключить проектор для проведения презентации и вам нужно все настроить прямо перед запуском (intel-virtual-output + xrandr), это может вызвать стресс. Вот небольшой скрипт, который выполняет свою работу (отказ от ответственности: много возможностей для улучшения, касательно стиля и т. Д.):

# beamer.sh: sets Linux display for doing a presentation, 
#  for bumblebee configured on a laptop that has the HDMI
#  plugged on the NVidia board.
#
# Bruno Levy, Wed Jan 24 08:45:45 CET 2018
#
# Usage: 
#    beamer.sh widthxheight
#    (default is 1024x768)


# Note: output1 and output2 are hardcoded below,
#  change according to your configuration.
output1=eDP1
output2=VIRTUAL1

# Note: I think that the following command should have done
# the job, but it does not work. 
#    xrandr --output eDP1 --size 1024x768 --output VIRTUAL1 --size 1024x768 --same-as eDP1
# My guess: --size is not implemented with VIRTUAL devices.
# Thus I try to find a --mode that fits my needs in the list of supported modes.

wxh=$1

if [ -z "$wxh" ]; then
  wxh=1024x768
fi

# Test whether intel-virtual-output is running and start it.
ivo_process=`ps axu |grep 'intel-virtual-output' |egrep -v 'grep'`
if [ -z "$ivo_process" ]; then
   intel-virtual-output
   sleep 3
fi

# Mode names on the primary output are simply wxh (at least on
#  my configuration...)
output1_mode=$wxh

echo Using mode for $output1: $output1_mode

# Mode names on the virtual output are like: VIRTUAL1.ID-wxh
# Try to find one in the list that matches what we want.
output2_mode=`xrandr |grep $output2\\\. |grep $wxh |awk '{print $1}'`
# There can be several modes, take the first one.
output2_mode=`echo $output2_mode |awk '{print $1}'` 

echo Using mode for $output2: $output2_mode

# Showtime !
xrandr --output $output1 --mode $output1_mode --output $output2 --mode $output2_mode --same-as $output1

update (10/07/2019)

«Исправление» для нового сбоя: напишите в скрипте следующее (назовите его bumblebee-startx.sh , например):

optirun ls # to load kernel driver
/usr/lib/xorg/Xorg :8 -config /etc/bumblebee/xorg.conf.nvidia \
 -configdir /etc/bumblebee/xorg.conf.d -sharevts \
 -nolisten -verbose 3 -isolateDevice PCI:01:00:0 \
 -modulepath /usr/lib/nvidia/nvidia,/usr/lib/xorg/modules/

(замените PCI: nn: nn: n на адрес вашей карты NVidia, полученный с помощью lspci)

Запустите этот сценарий из окна терминала от имени пользователя root ( sudo bumblebee-startx.sh ), оставьте терминал открытым, затем optirun и intel-virtual-output работать должным образом (примечание: иногда мне нужно запустить xrandr в дополнение к обнаружению экрана / видеопроектора).Теперь я не понимаю, почему та же самая команда запускалась из сбоев шмеля, здесь столько загадок ... (но, по крайней мере, это дает временное исправление).

Как я понял: написал сценарий-оболочку для запуска xserver, объявил его как XorgBinary в bumblebee.conf, заставил сохранить командную строку ($ *) в файл,попробовал кое-что, связанное с LD_PRELOAD, установив патч на XServer, чтобы исправить сбой в osLookupColor (не сработало), но когда я попытался запустить ту же командную строку вручную, она сработала, и она продолжала работать без моего патча (но я все еще делаю не понимаю почему).

Обновление от 15.11.2019 После обновления у меня появилось много мерцаний, что делало систему непригодной для использования. Исправлено добавлением параметра ядра i915.enable_psr = 0 / etc / defaults / grub , затем sudo update-grub ). Если вы хотите сейчас, PSR означает «самообновление панели», функция энергосбережения графических процессоров Intel (которая может вызвать мерцание экрана).

12
16.05.2017, 16:47
4 ответа

Лучший способ решить эту проблему (IMO):

  • в zsh:

     l=(a b c)
    моя команда -f$^l
     

    или с помощью сжатия массива, чтобы аргумент не был привязан к опции:

     l=(a b c) o=(-f)
    моя команда "${o:^^l}"
     

    Таким образом, он по-прежнему работает, если массив l содержит пустые элементы или элементы, содержащие пробелы или любые другие проблемные символы для xargs. Пример:

     $ l=(a '' '"' 'x y' c) o=(-f)
    $ printf '<%s>\n' "${o:^^l}"
    <-f>
    <а>
    <-f>
    <>
    <-f>
    <">
    <-f>
    <х у>
    <-f>
    <с>
     
  • в rc:

     l=(a b c)
    моя команда -f$l
     
  • в fish:

     set l a b c
    моя команда -f$l
     

(AFAIK, rc и fish не имеют сжатия массива)

Со старыми Bourne-подобными оболочками, такими как bash, вы всегда можете сделать (по-прежнему разрешены любые символы в элементах массива $@):

set -- a b c
for i do set -- "$@" -f "$i"; shift; done
mycommand "$@"
6
27.01.2020, 19:55

Один из способов сделать это:

echo "a b c" | xargs printf -- '-f %s\n' | xargs mycommand

Предполагается, что a, b и c не содержат пробелов , новые строки, кавычки или обратную косую черту. :)

С помощью GNU findutil вы можете справиться с общим случаем, но это немного сложнее:

echo -n "a|b|c" | tr \| \\0 | xargs -0 printf -- '-f\0%s\0' | xargs -0 mycommand

Вы можете заменить разделитель | каким-либо другим символом, который не t появляются в a, b или c.

Редактировать: Как отмечает @MichaelMol, при очень длинном списке аргументов существует риск переполнения максимальной длины аргументов, которые могут быть переданы в mycommand. Когда это произойдет, последний xargs разделит список и запустит другую копию mycommand, и есть риск, что она оставит незавершенным -f. Если вы беспокоитесь об этой ситуации, вы можете заменить последний xargs -0 выше чем-то вроде этого:

... | xargs -x -0 mycommand

Это не решит проблему, но прервет выполнение mycommand, когда список аргументов становится слишком длинным.

19
27.01.2020, 19:55

Самый простой способ префикса аргументов — через printfв сочетании с подстановкой команды :

l="a b c"

mycommand $(printf ' -f %s' $l)

В качестве альтернативы подстановка команды $()может быть переписана конвейером вxargs:

printf ' -f %s' $l | xargs mycommand

Подстановка команды позволяет управлять расположением динамических аргументов в списке аргументов. Например, вы можете добавлять аргументы в начале, в конце или даже размещать их в любом месте между любыми другими фиксированными аргументами, которые будут переданы в mycommand.

Подход xargsлучше всего подходит для добавления аргументов в конец, но он требует более неясного синтаксиса для обработки различного размещения динамических аргументов среди фиксированных.

3
12.05.2020, 01:06

Вот мой реальный -мировой пример. Это быстрый и грязный хак, но он работает.

docker-compose exec postfix mailq | egrep '^[A-Z0-9]{8}' | cut -f 1 -d " " | \
  xargs printf -- '-d %s\n' | \
  xargs -n4 -d '\n' echo "docker-compose exec -- postfix postsuper"

Приведенный выше код будет генерировать такой вывод:

docker-compose exec -- postfix postsuper -d 794B95AB886 -d 7D2375AA207
docker-compose exec -- postfix postsuper -d 0A6AE5AA244 -d 048D85AA231
...
0
11.01.2021, 06:31

Теги

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