Проблема с экранированием строки: Powershell -> Bash -> More Bash

#bash #powershell #escaping #windows-subsystem-for-linux

#bash #powershell #убегающий #windows-подсистема-для-linux #экранирование #windows-subsystem-for-linux

Вопрос:

Я работаю над Powershell 7 и WSL / bash.

Основываясь на другом ответе на этом сайте, я создал свою собственную версию watch , которая способна отображать больше цветов. И до сих пор все работало нормально. Это выглядит следующим образом:

 while sleep 1; do
   x="$("$@" 2>amp;1)"
   clear
   echo "$x"
done
  

Я пытаюсь передать следующую команду my_watch , чтобы она повторилась:

 task rc.defaultwidth=$(tput cols)
  

Который в Powershell / WSL выглядит примерно так:

 wsl ~/my_watch 'task rc.defaultwidth=$(tput cols)'
  

Проблема в том, что $(tput cols) вычисляется слишком рано, я думаю, прямо перед my_watch вызовом. Таким образом, результат вычисления передается в my_watch , что означает, что ширина настраивается заранее, а затем не изменяется во время цикла просмотра.

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

Но я не могу понять, как экранировать tput cols часть, чтобы она ожидала выполнения внутри my_watch цикла.

Благодарен за любую помощь.

Комментарии:

1. К сожалению, использование "$@" позволяет передавать только фиксированные аргументы, а не выражение для вычисления аргументов (например $(tput cols) ). Чтобы передать выражение, вам нужно было бы сделать что-то вроде передачи его в виде строки, заключенной в одинарные кавычки, а затем использовать eval для его синтаксического анализа. К сожалению, хотя этот подход был бы более эффективным, его также еще сложнее выполнить правильно и добавляет множество способов получения причудливых неожиданных результатов.

2. Я предполагаю, что одним из решений было бы жестко закодировать переданное значение и превратить его из универсального сценария просмотра в не универсальный сценарий display_task.