요약:
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
Pipe to Cat도 수정했습니다.
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는 이러한 명령을 중지하지 않습니다.
무슨 일인지 아는 사람 있나요?