Мой ДИСПЛЕЙ установлен как «:0.0», и он работает хорошо. Я получил эту настройку методом проб и ошибок, но в часто задаваемых вопросах CYGWIN/X сказано следующее:
3.13. I upgraded and now X clients can't connect
A1:
Since X server 1.17, by default the server does not listen for TCP/IP
connections, only accepting local connections on a unix domain socket.
For local clients, use DISPLAY=:0.0, rather than DISPLAY=localhost:0.0,
DISPLAY=127.0.0.1:0.0, DISPLAY=::1:0.0, etc. See Q: 1.6..
A2:
For remote clients, rather than connecting over TCP/IP by explicitly
setting DISPLAY and allowing access using xhost or by disabling access
control, use ssh tunnelling with ssh -Y instead. (See the User's Guide
section on X forwarding using ssh for more details).
A3:
Use the -listen tcp option to restore the previous behaviour, allowing
the X server to open a TCP/IP socket as well e.g. startxwin -- -listen
tcp. See Q: 4.2..
Часто задаваемые вопросы по CYGWIN/Xhttps://x.cygwin.com/docs/faq/cygwin-x-faq.html
Проблем почти столько же, сколько строк в вашем скрипте, я пытаюсь пройтись по одной, на каждом этапе предполагая, что все остальное работает как задумано.
1.
list="$1\n$2\n$3"
Это не сработает, потому что \n
не будет заменено новой строкой, вам понадобится что-то вроде этого:
list="$1"$'\n'"$2"$'\n'"$3"
или
list="$1
$2
$3"
2.
for i in $varNames $list; do
Предполагая, что вы зафиксировали (1 ), этот цикл будет выполняться 6 раз (Отказ от ответственности, см. последнее предложение этого ). По одному разу для каждого из $varNames
и $list
, что, я думаю, не предназначено. Кроме того, когда вы выполняете такой цикл, переменные будут разделены не новой строкой, а$IFS
. По умолчанию это новая строка, пробел или табуляция. Так что это работает, но, зная это, вы также можете просто использовать list="$1 $2 $3"
в (1 ). Конечно, это работает только в том случае, если вы знаете, что каждая из этих переменных не содержит символов новой строки, пробела или табуляции.
3.
echo -e $varNames$list
выводит целые переменные, а не только разделенные части, которые были бы $i
.
4.
Вы перезаписываете весь файл для каждой итерации. Лучшее использование
for...; do... done > file
И что теперь?
Я думаю, что вы не можете легко исправить свой код как есть. Вместо этого вы должны использовать массивы bash и перебирать ключи :
.#!/bin/bash
list=("$1" "$2" "$3")
varNames=("var1" "var2" "var3")
for k in "${!varNames[@]}"; do
printf '%s=%s\n' "${varNames[$k]}" "${list[$k]}"
done > "vars-$(date +%Y-%m-%d_%H.%M).file"
Я предпочитаю использовать printf
(, см. это ), но вы также можете использовать echo
вот так, если вам все равно...
echo "${varNames[$k]}=${list[$k]}"