Я нашел ответ, и исправление состоит в том, чтобы ввести следующее в командной строке администратора, предполагая, что диск 0
- это C:
и раздел 2
- это рассматриваемый раздел.
Введите diskpart и нажмите Enter Выполните следующие команды, чтобы расширить раздел:
SELECT DISK 0
SELECT PARTITION 2
EXTEND FILESYSTEM
EXIT
Ваш код cat >( echo hola; )
никогда не выйдет, потому что
hola
Ctrl+D
, он продолжает искать файл для записи. Вариант 1:Запись контекста в файл, который отображается
cat > $( echo hola; )
поэтому любой контекст, который мы даем ниже, будет сохранен в файле с именем hola
.
Обратите внимание, :мы можем выйти из блока кота с помощьюCtrl+D
Вариант 2:Выделить контекст, который отображается.
cat <(echo hola;)
cat
не зависает, он ждет вашего ввода. cat
читает стандартный ввод и записывает в стандартный вывод. Вы не перенаправляете стандартный ввод, поэтому стандартный ввод — это ваш терминал. Когда вы набираете Ctrl+D
, вы указываете Конец -файла -, и ваш cat
завершится.
Понятия не имею, чего вы пытаетесь добиться, но:
>(...)
делает доступным для записи стандартный ввод того, что выполняется. cat
ожидает файл, который можно прочитать Нет никакой гарантии, что все, что предоставлено (1 ), может быть прочитано. В macOS я просто получаю сообщение об ошибке:
bash-4.4$ cat >( echo foo)
foo
cat: /dev/fd/63: Permission denied
В Linux для меня это труба, на другом конце которой ничего не пишет:
$ strace -e openat cat >(echo foo)
foo
...
openat(AT_FDCWD, "/dev/fd/63", O_RDONLY) = 3
И:
$ ll /proc/$(pgrep cat)/fd/3
lr-x------ 1 muru muru 64 Aug 13 18:55 /proc/3381/fd/3 -> 'pipe:[37501]'
$ lsof | grep 37501
strace 3433 muru 63w FIFO 0,12 0t0 37501 pipe
cat 3435 muru 3r FIFO 0,12 0t0 37501 pipe
cat 3435 muru 63w FIFO 0,12 0t0 37501 pipe
Неважно, что на другом конце было закрыто stdin и выходило -, канал был открыт только для чтения , а не для записи, и в канал ничего не записывалось. Таким образом, cat
останется там, ожидая завершения чтения. (И strace
, и cat
здесь имеют дескриптор открытого файла для записи в этот канал, но это потому, что bash открыл его для записи и сделал доступным для них. Никто не собирается писать об этом.)
Подстановка процессов — отдельная тема. Важно понимать, что это больше похоже на FIFO, чем на стандартный ввод или стандартный вывод. Вы можете увидеть это с помощью эха:
echo >( echo hello; )
дает вам :/dev/fd/63 привет
Внешнее эхо -дает вам фактически заданный аргумент, то есть /dev/fd/63
. Итак, ваш
cat >( echo hello; )
на самом деле cat /dev/fd/43
, и вывод отправляется на echo hello
. (43 — это всего лишь пример; число случайное, но часто 63)
Вы также можете увидеть разницу между:
echo hop > >(cat)
, что дает hop
и
echo hop >(cat)
что дает hop /dev/fd/63
.
Также, например,:
sed 's/$/klap/' | tee >(sed 's/^/hop/')
что дает для вводаklop
klopklap
hopklopklap
klopklap
— это стандартный вывод tee
, а hopklopklap
— стандартный вывод sed
в процессе подстановки.
Так почему cat >(echo hello)
зависает? Потому что, как сказано, cat получает аргумент /dev/fd/32
и из этого «файла» никогда не получает EOF.