В общем, echo $(somecmd)
не очень полезен для любого somecmd
. Вывод somecmd
будет расширен до аргументов echo
, а затем echo
возьмет свои аргументы и напечатает их на своем выходе. Обычно вместо этого вы можете просто запустить somecmd
.
Разница между этими двумя заключается в обычном :разделении и объединении слов -. echo $(somecmd)
будет сжимать пробелы и расширять все, что выглядит как глобус имени файла(*.txt
). Этого, конечно, не произойдет при запуске только somecmd
или при запуске echo "$(somecmd)"
с кавычками, хотя и удаляют все, кроме последней новой строки. также есть вероятность, что ваш echo
расширяет обратную косую черту -.
Что касается less
, его цель — позволить интерактивный просмотр файлов или входных каналов, а для этого в значительной степени требуется терминал. Когда вы запускаете его в подстановке команд, вывод less
вместо этого подключается к каналу, и он возвращается к поведению, очень похожему на cat
. (Кажется, я не могу найти упоминания о точном поведении на странице руководства.)
Теперь, если вам серьезно нужен сценарий, который запускается внутри подстановки команд, позволяя пользователю просматривать некоторые выходные данные и при этом возвращая некоторый другой текст посредством подстановки команд, вы можете творчески использовать перенаправления (, перефразируя mosvy's комментарий):
$ cat myscript
#!/bin/bash
echo this is the output
cat >&2 <<EOF
you can
browse this
with less
EOF
$ foo=$(./myscript 2> >(less > /dev/tty))
Стандартный вывод скрипта идет на подстановку команд, а вывод ошибки — на less
, поэтому foo
устанавливается на this is the output
. Я не уверен, что это полезно, так как вы не сможете изменить значение, идущее к foo
в интерактивном режиме, по крайней мере, только с помощью less
.
Кроме того, такой запуск less
нарушает управление заданиями, поэтому нажатие Ctrl -C во время работы приводит к странному поведению и т. д.
Здесь, вероятно, было бы лучше просто использовать временный файл. Пусть myscript
запишет результат в файл с именем в качестве аргумента (, то есть echo "$result" > "$1"
),затем запустите:
tmp=$(mktemp)
myscript "$tmp"
cd "$(cat "$tmp")"
rm "$tmp"
Теперь myscript
может запускать less
или другую интерактивную программу в обычном режиме, и проблем с контролем заданий быть не должно.
Скорее всего, эти символические ссылки указывают на файлы, которые не закрываются. Возможно, Homebrew обновил Python до 3.8.6, но по какой-то причине не обновил символические ссылки.
Чтобы исправить, попробуйте:
brew unlink python@3.8 && brew link python@3.8
Если это не помогло, попробуйте:
brew reinstall python@3.8