#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.