Объединение строк, переданных в качестве аргументов, с нулевым символом в качестве разделителя

Основываясь на моем случае, когда я впервые использовал расширенный монитор с Fedora 25, вот как я решил эту проблему.

Сначала проверьте свою сессию gnome, использует ли она Wayland или Xorg, вы можете проверить это, выполнив эту команду

xrandr -q

Если отображается ваше мониторное устройство, подобное Xwayland0или Xwayland1, вы должны перейти на использование Xorg.

Во-вторых , измените сеанс на использование xorg, если вы используете wayland, отредактировав файл по адресу

/etc/gdm/custom.conf

Затем раскомментируйте строку WaylandEnable=false, чтобы отключить ее.

# GDM configuration storage

[daemon]
# Uncoment the line below to force the login screen to use Xorg
#WaylandEnable=false

[security]

[xdmcp]

[chooser]

[debug]
# Uncomment the line below to turn on debugging
#Enable=true

Третий перезагрузите компьютер, чтобы изменения вступили в силу

В-четвертых, проверьте разрешение экрана, выполнив команду xrandr -qеще раз, для каждого устройства будет разная информация

Screen 0: minimum 8 x 8, current 3046 x 1050, maximum 32767 x 32767
LVDS1 connected primary 1366x768+0+0 (normal left inverted right x axis y axis) 310mm x 170mm
   1366x768      60.10*+
   1024x768      60.00  
   1024x576      60.00  
   960x540       60.00  
   800x600       60.32    56.25  
   864x486       60.00  
   640x480       59.94  
   720x405       60.00  
   680x384       60.00  
   640x360       60.00  
DP1 disconnected (normal left inverted right x axis y axis)
DP2 disconnected (normal left inverted right x axis y axis)
DP3 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
HDMI2 disconnected (normal left inverted right x axis y axis)
HDMI3 disconnected (normal left inverted right x axis y axis)
VGA1 connected 1680x1050+1366+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1024x768      60.00*+  
   800x600       60.32    56.25  
   848x480       60.00  
   640x480       59.94  
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

информация выше взята из моих (она может отличаться от вашей, например)

Пятое , как видите, у меня нет разрешения VGA1больше, чем 1024x768, но мне нужно настроить монитор, подключенный к VGA1, на разрешение 1680x1050, вот хитрости

Шесть Создайте собственное разрешение экрана с помощью cvt , в данном случае я хочу добавить разрешение1680x1050

cvt 1680 1050

cvt будет выдавать информацию типа

# 1680x1050 59.95 Hz (CVT 1.76MA) hsync: 65.29 kHz; pclk: 146.25 MHz
Modeline "1680x1050_60.00"  146.25  1680 1784 1960 2240  1050 1053 1059 1089 -hsync +vsync

затем на следующем этапе мы создадим наш режим разрешения на основе этой информации

xrandr --newmode "1680x1050_60.00"  146.25  1680 1784 1960 2240  1050 1053 1059 1089 -hsync +vsync
xrandr --addmode VGA1 "1680x1050_60.00"

как вы можете видеть, две приведенные выше команды создадут новый режим, назначив --newmodeразрешение экрана 1680x1050_60.00и добавив этот режим разрешения, используя --addmodeна моем подключенном мониторе на VGA1(. Убедитесь, что ваш монитор подключен, проверьте с помощьюxrandr -q)

Затем для Последнего шага мы применяем это разрешение к нашему монитору, которое в этом примере равно VGA1, выполнив эту команду

xrandr --output VGA1 --mode 1680x1050_60.00

Если все шаги были выполнены правильно, дисплей вашего монитора теперь должен отображаться на выбранном дисплее, вы также можете проверить это, выполнив команду xrandr -q, и, поскольку эта инструкция основана на моем опыте,извините меня, если этот метод все еще не помогает для вас.

*советы Если у вас есть случай, когда ваш монитор просто мерцает после того, как вы установили вывод или добавили режим, сначала создайте резервную копию файла на ~/.config/monitors.xml, а затем удалите его

0
05.07.2019, 16:20
2 ответа

printf может позаботиться об этом, почти:

printf "%s\0" "$a" "$b" "$c"...

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

Чтобы избавиться от последнего нулевого байта, используйте GNUhead:

printf "%s\0" "$a" "$b" "$c"... | head -c-1

Встроенная функция Zsh printтакже может делать это без постобработки -:

print -rNn "$a" "$b" "$c"...

(-rотключает обработку перехода, -Nпечатает аргументы, разделенные и заканчивающиеся нулевыми байтами, -nотключает терминальную новую строку. Спасибо steeldriver за подсказку!)

3
28.01.2020, 02:18

Команда printfбудет повторять формат столько раз, сколько необходимо, поэтому мы можем просто выполнить

print "%s\0"

Мы можем увидеть это в действии:

$ printf "%s\0" hello there | hdump -8                   
00000000  68 65 6C 6C 6F 00 74 68   hello.th
00000008  65 72 65 00               ere.

$ printf "%s\0" hello there everyone out there | hdump -8
00000000  68 65 6C 6C 6F 00 74 68   hello.th
00000008  65 72 65 00 65 76 65 72   ere.ever
00000010  79 6F 6E 65 00 6F 75 74   yone.out
00000018  00 74 68 65 72 65 00     .there.

Обратите внимание, что также помещает терминальный NUL в конец строки. Если вы этого не хотите, мы можем удалить его, например, с помощьюsed 's/.$//'

$ printf "%s\0" hello there everyone out there | sed 's/.$//' | hdump -8
00000000  68 65 6C 6C 6F 00 74 68   hello.th
00000008  65 72 65 00 65 76 65 72   ere.ever
00000010  79 6F 6E 65 00 6F 75 74   yone.out
00000018  00 74 68 65 72 65        .there
3
28.01.2020, 02:18

Теги

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