ОК, лучшим решением для меня (но, думаю, это дело вкуса) было использование fgetcsv
от PHP, поскольку у меня уже есть PHP на этом сервере. Жаль, что команда bash read
не обрабатывает новые строки так же хорошо, как функция PHP. Она автоматически распознает дополнительные разделители (например, "'s").
Образец:
<?php
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 10000, "|")) !== FALSE) {
$num = count($data);
echo "$num fields in line $row:\n";
$row++;
for ($c=0; $c < $num; $c++) {
echo $c + 1 . ": " . $data[$c] . "\n";
}
}
fclose($handle);
}
?>
Вывод (например, в моем исходном вопросе):
4 fields in line 1:
1: aaa
2: 111
3: !!!
4:
4 fields in line 2:
1: bbb
2: 222
3: @@
@
4:
4 fields in line 3:
1: ccc
2: 333
3: ###
4:
Окончательное решение, не требующее привилегий root и доступное из не-интерактивной оболочки автоматизированным способом, более продвинутое и удобное в использовании, чем возможный дубликат ссылки, предоставленной ранее:
-XAUTHORITY
:
ps -u $(id -u) -o pid= |
xargs -I{} cat /proc/{}/environ 2>/dev/null |
tr '\0' '\n' |
grep -m1 '^XAUTHORITY='
-DISPLAY
:
ps -u $(id -u) -o pid= |
xargs -I{} cat /proc/{}/environ 2>/dev/null |
tr '\0' '\n' |
grep -m1 '^DISPLAY='
Фрагмент содержит список всех пользователей pids
, выполняет итерацию по ним, затем прерывается на первом совпадении
На основании этого
В дистрибутивах с системой инициализации systemd
вывод
systemctl --user show-environment
показывает DISPLAY
и XAUTHORITY
. По крайней мере, это верно для моей системы Debian 9 с systemd и gdm3
в качестве диспетчера отображения.
Ошибка :После запуска startx xterm -- :2 vt2
на tty2 systemctl выдал мне DISPLAY
и XAUTHORITY
из нового дисплея; мой основной дисплей :0
больше не был таким видимым.
Другие подходы:
По крайней мере, для XAUTHORITY
надежнее проанализировать вывод ps aux | grep Xorg
и найти опцию -auth
. В моем случае он находится в /run/user/1000/gdm/Xauthority
, а не в ~/.Xauthority
.
Подводные камни:
Xwayland
. Xvfb
или что-то другое. Обычно команды Xorg
также содержат номер дисплея. К сожалению, мой не:
/usr/lib/xorg/Xorg vt1 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -background none -noreset -keeptty -verbose 3
-displayfd 3
каким-то образом указывает на DISPLAY
. Если смотреть как root в /proc/$(pidof Xorg)/fd/3
, я нахожу
lrwx------ 1 root root 64 Mär 8 22:45 3 -> socket:[21437]
Хотя я не знаю, как искать сокет 21437
. Я уверен, что это указывает на /tmp/.X11-unix/X0
. Одним из подходов является lsof +E -aUc Xorg
, который показывает интересные выходные данные :много соединений, содержащих @/tmp/.X11-unix/X0
и одно соединение dbus
.
Немного грязно :Папка fd
тоже показывает мне
l-wx------ 1 root root 64 Mär 8 22:45 5 -> /var/log/Xorg.0.log
Xorg.0.log
является четким указанием для дисплея :0
.
Другой подход :notify-send
, кажется, собирает DISPLAY
и XAUTHORITY
с некоторой dbus
магией. Но я понятия не имею, как. Это может быть самый чистый и переносимый способ, если хотя бы запущен демон dbus.