/dev/pts에 쓰면 ~/.bashrc를 얻을 수 있나요?

/dev/pts에 쓰면 ~/.bashrc를 얻을 수 있나요?

여러 개의 터미널 창이 열려 있습니다. 방금 변경했으며 열려 있는 모든 터미널에서 실행 ~/.bashrc하고 싶습니다 .source ~/.bashrc

내가 보기엔 그냥

source ~/.bashrc | tee /dev/pts/{0..12}

, ~/.bashrc모든 터미널에서 실행되어야 합니다. clear의 끝에 를 추가했기 때문에 그런 것 같습니다 ~/.bashrc.

하지만 제가 구체적으로 테스트하고 있는 것은

PROMPT_COMMAND="history -a; history -c; history -r; ${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}"

모든 터미널에 대한 단일 정보 소스를 효과적으로 생성하고 열려 있는 모든 터미널에서 수정합니다.

이제 이것이 글쓰기와 관련이 있는지 /dev/pts/{0..12}또는 그것이 작동하는 방식과 관련이 있는지는 확실하지 않습니다 history. , git log및 가 실행 중인 열려 있는 터미널 중 하나를 보면 echo $PROMPT_COMMAND다음과 같이 합니다.아니요예상했던 수정 사항이 ~/.bashrc적용되었는지 확인하세요. 명령 누락으로 인해 실행 중인 별도의 터미널에서 출력을 볼 수 없습니다 history. 나중에 실제로 수정했는지 확인하고 싶습니다.git logtail -f ~/.bash_historyPROMPT_COMMANDsource ~/.bashrc

echo $PROMPT_COMMAND | tee /dev/pts/{0..12}그러나 각 터미널에 값이 무엇인지 물어보면 다음과 같은 PROMPT_COMMAND결과를 얻습니다.

history -a; history -c; history -r; pre_prompt_command; echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/\~}\007"

여기에는 history -a; history -c; history -r;내가 추가한 변경사항이 포함됩니다 ~/.bashrc.

이제 나는 혼란스러워졌습니다. 내가 뭘 잘못했나요? 아니면 제가 잘못 이해하고 있는 걸까요? 수정 됐나요 PROMPT_COMMAND, 안됐나요? 아니면 bash/linux가 작동하는 방식의 결과입니까? 나는 이것이 버그가 아니라 사용자 오류라고 확신합니다.

답변1

source ~/.bashrc현재 쉘 소스를 만듭니다 ~/.bashrc. 출력을 다음으로 리디렉션하면 tee(귀하의 경우 여러 파일로 전송 /dev/pts/…) 리디렉션됩니다.산출.bashrc내용이 아닌 의 명령입니다 .bashrc.

그러나 이렇게 해도 cat ~/.bashrc | tee /dev/pts/{0..12}콘텐츠를 다른 셸로 보내는 것이 아니며 다른 셸의 명령줄을 echo 'source ~/.bashrc' | tee /dev/pts/{0..12}삽입하는 것도 아닙니다 . source ~/.bashrc바라보다문자열을 tty에 넣어 명령을 구성합니다., 특히이 답변:

터미널은 입력 장치(예: 키보드)와 디스플레이 장치(예: 모니터)의 두 가지 역할을 합니다. 터미널에서 읽으면 입력 장치에서 나오는 내용을 얻게 됩니다. 터미널에 쓰면 데이터가 디스플레이 장치에 표시됩니다.

바이트를 보내면 /dev/pts/…디스플레이 장치에서만 반응을 얻을 수 있으며 이를 사용하는 쉘(또는 다른)에서는 반응을 얻을 수 없습니다. 디스플레이 장치는 일반적으로 사용자가 보내는 내용을 표시/인쇄하여 반응합니다. 그러나 일부 바이트 시퀀스는 특별합니다.

clear그것은 우연히 만들어진다 .산출일부 특수한 바이트 시퀀스로 인해 출력을 리디렉션하고 분기하면 다른 터미널이 화면을 지워 반응합니다. 일반적으로 다른 터미널은 clear순서가 clear다음에 따라 달라 지므로 "외부"에 반응할 수도 있고 반응하지 않을 수도 있습니다 $TERM.clear), 따라서 실행 중인 터미널에 맞게 조정되었습니다 clear.

마찬가지로 echo $PROMPT_COMMAND | tee /dev/pts/{0..12}다른 쉘에서는 어떤 작업도 수행되지 않습니다. 현재 쉘이 확장되었습니다 $PROMPT_COMMAND(큰따옴표로 묶어야 합니다.), echo결과를 여러 터미널로 tee보냅니다 . tee각 터미널인쇄제공된 변수 값현재의쉘; 다른 쉘은 포함되지 않습니다.

일반적으로 말하자면, Linux에서는 문자열을 입력한 것처럼 삽입하는 간단한(예: 또는 와 같은 >/dev/pts/…간단한 ) 방법이 없습니다. tee /dev/pts/…프로그래머는 다음을 사용할 수 있습니다.티옥티. 터미널 멀티플렉서와 ​​터미널 에뮬레이터는 자신이 에뮬레이트하는 터미널에 키 입력을 보내는 방법을 제공할 수 있습니다(예:send-keys티먹스). 그럼에도 불구하고 명령을 주입하는 것은 일반적으로 우아한 방법이 아닙니다. "쉘"에 bash 이외의 다른 것이 있을 수도 있고 (bash 여부에 관계없이) 입력을 소비할 수 있는 다른 것을 실행하느라 바쁠 수도 있기 때문입니다. 통과할 수도 있습니다. 원하지 않는 사항에 대응하려면 다음을 수행하십시오.

또한 source ~/.bashrcEnter대화형 bash의 명령줄에 직접 입력하는 경우에도 "오작동"할 수 있습니다. ~/.bashrc깨끗한 쉘에 자동으로 한 번 가져오는 것을 의미합니다.이전 셸에서 새 버전을 얻는 것은 새 셸을 시작하는 것과 다릅니다.

관련 정보