바인딩을 나열할 때 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-grep및를 사용하여 gnu-sort테스트한 결과 동일한 결과를 얻었습니다.

추가 파일을 생성할 필요가 없도록 프로세스 대체를 사용하여 bash의 기본 바인딩을 비교하려고 합니다.

이것이 Emacs 기본 바인딩을 얻는 방법입니다. 나는 빈 상태로 bash 명령을 실행합니다 INPUTRC. 이는 나중에 사용될 바인딩과 이러한 바인딩을 비교할 수 grep있도록 필요하지 않은 바인딩을 제거하는 것입니다 . 여기서 이 명령을 받았어요sortemacsvicomm여기.

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는 이러한 명령을 중지하지 않습니다. 영상

무슨 일인지 아는 사람 있나요?

관련 정보