Системная информация:
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скажут выходные данные , ни в одном из этих случаев снаряды не заморожены или не застряли. Они просто ждут дочерних процессов обычным способом; и они действительно вернутся к запросу ввода обычным способом, как только эти дочерние процессы будут приостановлены или завершены. Название и текст вашего вопроса включают в себя неявную ложную предпосылку. "Почему моя раковина замерзает?" это нерешенный загруженный вопрос, когда ваша оболочка вообще не зависает. У вас был бы лучший вопрос для устранения этой скрытой ложной предпосылки.