总括:
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-grep
和gnu-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
绑定的方法。只需替换emacs
为vi-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 不会停止这些命令
有人知道发生了什么事吗?