Системная информация:
macOS Sierra 10.12.6
zsh 5.4.2 (x86_64-apple-darwin16.7.0)
GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin16.3.0)
Перейдите к ПРИМЕРАМ внизу, если вы хотите просто перейти к упрощенным примерам, которые я сделал.
ПРИМЕЧАНИЕ: я не большой zsh
пользователь.
Я искал fzf
комбинации клавиш для bash
и zsh
.
Обратите внимание, как они оба запускают переменную команду $(__fzfcmd)
. __fzfcmd
по умолчанию выводит fzf
в stdout, а подстановка параметров просто запускает command ( fzf
), полученную в результате вывода.
Одно из отличий между сценарием bash
и zsh
сценарием заключается в том, что bash
он дополнительно выводит выходные данные, $(__fzfcmd)
а zsh
просто захватывает их внутри массива. Я предполагаю, что из-за проблемы, zsh
когда вы продолжаете fzf
направлять вывод, куда вы не можете ввести, fzf
а процесс, по которому fzf
передается, не получает никакого стандартного ввода. Ваш единственный выбор - ^Z
или ^C
. ^C
кажется, фоном процесса по какой-то причине. Или, может быть, они просто хотели это в массиве, чтобы они могли работать zle vi-fetch-history
на нем . bash
Версия делает некоторые магии в ключе связывания с"\e^": history-expand-line
Сейчас fzf
не важно. Кажется, что вам просто нужна программа, которая выводит в, tty
чтобы вызываться путем подстановки параметров, чтобы вызвать эту проблему. Поэтому я покажу несколько простых примеров.
Вот некоторые другие команды, tty
которые могут вызвать эту проблему в zsh
:
- vipe (запустить редактор в середине трубы)
'vim -'
(сделать vim прочитанным из stdin. похоже на vipe, но не выводится в stdout)
В приведенных ниже примерах заменить каждое вхождение vipe
с , vim -
если вы не хотите , чтобы сделать отдельную установку. Просто помните, что vim -
содержимое редактора не выводится на стандартный вывод, как это vipe
делается.
ПРИМЕРЫ:
1) echo 1 | vipe | cat # works in both bash and zsh
2) echo 1 | $(echo vipe) | cat # works in bash only. zsh problem with no output until I hit `^C`:
^C
zsh: done echo 1 |
zsh: suspended (tty output) $(echo vipe) |
zsh: interrupt cat
# seems like the process is backgrounded. I can still see it in jobs command
3) cat <(echo 1 | $(echo vipe)) # zsh and bash has the problem. I'm guessing because
# the file isn't finished writing and cat is
# blocking vipe's tty output
# both their `^C` output is just:
^C # nothing special, as expected
4) cat < <(echo 1 | $(echo vipe)) # works in both bash and zsh
5) echo 1 | $(echo vipe) > >(cat) # works in both bash and zsh
# The following don't have and input pipe to vipe.
# Type something then send EOF with ^D
6) vipe | cat # works for both
7) $(echo vipe) | cat # works for both
Теперь я в основном задаюсь вопросом, почему 2)
есть проблема, zsh
но не для, bash
и почему 4)
и 5)
устраняет проблему zsh
.
Требования, zsh
чтобы эта проблема выглядела именно так, как я положил в заголовке:
- входная труба
- команда, выполняемая заменой переменной / параметра, которая имеет
tty
вывод - выходная труба
ОБНОВИТЬ
Я добавил другой обходной путь, который не вызывает zsh
этой проблемы 5)
. Это похоже на, 4)
но вместо того, чтобы перенаправлять stdout
напрямую stin
, я перенаправляю его в файл, который перенаправляет на stdin
использование процесса подстановки.
when either a computer program or system ceases to respond to inputs
(echo | $(echo vipe) | cat)
ps
скажут выходные данные , ни в одном из этих случаев снаряды не заморожены или не застряли. Они просто ждут дочерних процессов обычным способом; и они действительно вернутся к запросу ввода обычным способом, как только эти дочерние процессы будут приостановлены или завершены. Название и текст вашего вопроса включают в себя неявную ложную предпосылку. "Почему моя раковина замерзает?" это нерешенный загруженный вопрос, когда ваша оболочка вообще не зависает. У вас был бы лучший вопрос для устранения этой скрытой ложной предпосылки.