как перенаправить многострочную команду bash в переменную

  1. Разверните дополнительный X-сервер с помощью Xephyr. Это сделано для безопасности — это предотвращает компрометацию вашей удаленной системой.

  2. Используйте SSH для переадресации удаленного сокета на сокет Xephyr. SSH также поддерживает переадресацию сокетов Unix.

  3. Правильно задайте переменные среды на удаленном сервере.

0
04.12.2020, 08:05
3 ответа

Ошибка заключается в отсутствии точек с запятой (, которые в противном случае эквивалентны символам новой строки ). И если вы хотите увидеть структуру вывода, добавьте двойные -кавычки. Попробуйте:

variable=$( { printf 'scan on\n\n' ; sleep 10 ; printf 'quit \n\n' ; } | bluetoothctl)
echo "$variable"
1
18.03.2021, 22:45

Возможной альтернативой может быть простой expectскрипт:

#!/usr/bin/expect

spawn bluetoothctl

send "scan on\r"

sleep 10

send "quit \r"

expect eof

\rравно «Возврат/нажатие ввода». Сделайте исполняемый файл и запустите.

1
18.03.2021, 22:45

Просто:

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)или комментарии с несбалансированными ), которые синтаксический анализатор оболочки ошибочно принимал за ), закрывающий замена команд.

5
18.03.2021, 22:45

Теги

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