Разверните дополнительный X-сервер с помощью Xephyr. Это сделано для безопасности — это предотвращает компрометацию вашей удаленной системой.
Используйте SSH для переадресации удаленного сокета на сокет Xephyr. SSH также поддерживает переадресацию сокетов Unix.
Правильно задайте переменные среды на удаленном сервере.
Ошибка заключается в отсутствии точек с запятой (, которые в противном случае эквивалентны символам новой строки ). И если вы хотите увидеть структуру вывода, добавьте двойные -кавычки. Попробуйте:
variable=$( { printf 'scan on\n\n' ; sleep 10 ; printf 'quit \n\n' ; } | bluetoothctl)
echo "$variable"
Возможной альтернативой может быть простой expect
скрипт:
#!/usr/bin/expect
spawn bluetoothctl
send "scan on\r"
sleep 10
send "quit \r"
expect eof
\r
равно «Возврат/нажатие ввода». Сделайте исполняемый файл и запустите.
Просто:
variable=$(
{
printf 'scan on\n\n'
sleep 10
printf 'quit \n\n'
} | bluetoothctl
)
Внутри подстановки команд может быть любой шелл-код¹, и он не обязательно должен быть на одной строке.
Здесь вы хотите захватить выходные данные всего конвейера (по сути, это будут выходные данные bluetoothctl
, поскольку все остальные команды перенаправляют свой стандартный вывод в канал, который идет кbluetoothctl
).
Вы также можете записать вывод bluetoothctl
только с помощью:
{
printf 'scan on\n\n'
sleep 10
printf 'quit \n\n'
} | variable=$(bluetoothctl)
Но в bash
, чтобы это работало, вам нужно установить lastpipe
опцию (shopt -s lastpipe
, которая работает только для не -интерактивных экземпляров оболочки ), для этого последнего компонента канала не для запуска в подоболочке.
Однако здесь вам не нужен конвейер, вы можете просто:
variable=$(bluetoothctl --timeout 10 scan on)
Если вы собираетесь отображать содержимое переменной, помните, что синтаксис:
printf '%s\n' "$variable"
не. echo $variable
Подробнее об этом на:
Здесь вывод bluetoothctl
содержит раскрашивающие escape-последовательности, а также escape-последовательности, используемые для очистки содержимого строк. Если оставить $variable
без кавычек,его содержимое будет подвергнуто разделению + glob, в результате чего будет получен случайный список слов для передачи в echo
, который echo
будет выводить через пробел -. Таким образом, вы получите все в одной строке, и если последнее слово заканчивается на четкая -строка последовательность (, что и происходит в моих тестах :\r\e[K
, будучи Carriage -Возвратите , а затем Очистить -В -Конец -Из -Строки последовательность ), вы просто увидите пустую строку.
¹ хотя некоторые оболочки, в том числе bash
, использовали код с несовпадающими круглыми скобками, например, когда код включал операторы case, такие как case $x in foo)
или комментарии с несбалансированными )
, которые синтаксический анализатор оболочки ошибочно принимал за )
, закрывающий замена команд.