простая замена процесса эха кошки зависает

Я нашел ответ, и исправление состоит в том, чтобы ввести следующее в командной строке администратора, предполагая, что диск 0 - это C: и раздел 2 - это рассматриваемый раздел.

Введите diskpart и нажмите Enter Выполните следующие команды, чтобы расширить раздел:

SELECT DISK 0
SELECT PARTITION 2
EXTEND FILESYSTEM
EXIT
-1
14.08.2018, 01:14
4 ответа

Ваш код cat >( echo hola; )никогда не выйдет, потому что

  • сначала будет повторяться шаблонhola
  • И принимает ввод для записи.
  • когда мы даем Ctrl+D, он продолжает искать файл для записи.

Вариант 1:Запись контекста в файл, который отображается

cat > $( echo hola; )

поэтому любой контекст, который мы даем ниже, будет сохранен в файле с именем hola.

Обратите внимание, :мы можем выйти из блока кота с помощьюCtrl+D

Вариант 2:Выделить контекст, который отображается.

cat <(echo hola;)
1
28.01.2020, 05:07

catне зависает, он ждет вашего ввода. catчитает стандартный ввод и записывает в стандартный вывод. Вы не перенаправляете стандартный ввод, поэтому стандартный ввод — это ваш терминал. Когда вы набираете Ctrl+D, вы указываете Конец -файла -, и ваш catзавершится.

0
28.01.2020, 05:07

Понятия не имею, чего вы пытаетесь добиться, но:

  1. >(...)делает доступным для записи стандартный ввод того, что выполняется.
  2. 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 открыл его для записи и сделал доступным для них. Никто не собирается писать об этом.)

2
28.01.2020, 05:07

Подстановка процессов — отдельная тема. Важно понимать, что это больше похоже на 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.

0
28.01.2020, 05:07

Теги

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