Бинарный файл python3 в /usr/local/bin, но тоже… нет?

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

0
27.10.2020, 22:43
1 ответ

Скорее всего, эти символические ссылки указывают на файлы, которые не закрываются. Возможно, Homebrew обновил Python до 3.8.6, но по какой-то причине не обновил символические ссылки.

Чтобы исправить, попробуйте:

brew unlink python@3.8 && brew link python@3.8

Если это не помогло, попробуйте:

brew reinstall python@3.8
0
18.03.2021, 22:54

Теги

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