列出绑定时 Bash 进程替换挂起

列出绑定时 Bash 进程替换挂起

总括:

cat <(INPUTRC=/dev/null bash -c 'bind -pm emacs') # freezes

# I can't use this because I need to pipe the output of the bind
cat <(INPUTRC=/dev/null bash -c 'bind -pm emacs' &) # doesn't freeze

# I can use this. This won't work for comm below since it takes two file inputs.
cat < <(INPUTRC=/dev/null bash -c 'bind -pm emacs') # doesn't freeze

# I can use this.
cat <(INPUTRC=/dev/null bash -c 'bind -pm emacs') & fg # doesn't freeze

# I can use this. This is my current solution
cat <(INPUTRC=/dev/null bash -c 'bind -pm emacs') | cat # doesn't freeze

为什么它会冻结以及为什么后台可以修复它?说有事EOF,所以就等着吧stdin。有没有办法注入EOF?为什么会缺少一个EOF


我不知道这是一个错误还是我做错了什么。

我在 macOS 上使用 bash-4.4.12(1)-release,但我使用gnu-grepgnu-sort进行了测试并得到了相同的结果。

我正在尝试使用进程替换来比较 bash 的默认绑定,这样我就不必创建额外的文件。

这就是我获取 emacs 默认绑定的方式。我运行一个带有空的 bash 命令INPUTRC。这grep是为了删除不需要的绑定,这样sort我就可以将这些emacs绑定与稍后vi使用的绑定进行比较comm。我从这里得到这个命令这里

INPUTRC=/dev/null bash -c 'bind -pm emacs' |
LC_ALL='C' grep -vE '^#|: (do-lowercase-version|self-insert)$' |
sort

同样,以下是获取默认vi-insert绑定的方法。只需替换emacsvi-insert

INPUTRC=/dev/null bash -c 'bind -pm vi-insert' |
LC_ALL='C' grep -vE '^#|: (do-lowercase-version|self-insert)$' |
sort

好吧,现在我想比较这两个命令,comm所以我用进程替换包装这两个命令并运行comm它们。

comm \
  <(INPUTRC=/dev/null bash -c 'bind -pm emacs' |
    LC_ALL='C' grep -vE '^#|: (do-lowercase-version|self-insert)$' |
    sort) \
  <(INPUTRC=/dev/null bash -c 'bind -pm vi-insert' |
    LC_ALL='C' grep -vE '^#|: (do-lowercase-version|self-insert)$' |
    sort)

输出:

bash: line 0: bind: warning: line editing not enabled
bash: line 0: bind: warning: line editing not enabled
... (empty. I have to press CTRL+C to exit)

为了现在简单起见,这也会冻结

cat <(INPUTRC=/dev/null bash -c 'bind -pm emacs')

所以我发现上面说背景有&帮助,而且确实有效。

cat <(INPUTRC=/dev/null bash -c 'bind -pm emacs' &) # works, has output, no freeze

所以现在我尝试将这些知识应用到原始命令中,但我不能,因为有一个管道。

...'bind -pm emacs' &|... # doesn't work
...'bind -pm emacs' |&... # doesn't work, this is for redirecting stderr to stdout

然后我尝试将整个事情完全背景化。附加&在该长命令的最后。fg立即将其保留为一行命令。这有效

comm \
  <(INPUTRC=/dev/null bash -c 'bind -pm emacs' |
    LC_ALL='C' grep -vE '^#|: (do-lowercase-version|self-insert)$' |
    sort) \
  <(INPUTRC=/dev/null bash -c 'bind -pm vi-insert' |
    LC_ALL='C' grep -vE '^#|: (do-lowercase-version|self-insert)$' |
    sort) & fg

管道到猫也修复了它

comm \
  <(INPUTRC=/dev/null bash -c 'bind -pm emacs' |
    LC_ALL='C' grep -vE '^#|: (do-lowercase-version|self-insert)$' |
    sort) \
  <(INPUTRC=/dev/null bash -c 'bind -pm vi-insert' |
    LC_ALL='C' grep -vE '^#|: (do-lowercase-version|self-insert)$' |
    sort) | cat

我注意到,当我尝试使用冻结命令关闭终端时,这些进程仍在运行。因此 CTRL+C 不会停止这些命令 图像

有人知道发生了什么事吗?

相关内容