다른 사용자의 변수를 에코할 때 이상한 출력

다른 사용자의 변수를 에코할 때 이상한 출력
$ sudo su - user1 -c 'echo $DOMAIN_HOME'
/app/user1/DOMAINHOME

이거 좋아 보이는데요, 그렇죠? 그러나 조금 더 자세히 살펴보겠습니다.

$ sudo su - user1 -c 'echo $DOMAIN_HOME' | tee test.out
$less test.out

ESC]P0000000ESC]P8A9A9A9ESC]P1DC143CESC]P9FF0000ESC]P2008000ESC]PA00FF00ESC]P3aa9943ESC]PBFFD700ESC]P41E90FFESC]PC87CEFAESC]P5706c9aESC]PD826ab1ESC]P6FFA500ESC]PEF0F8FFESC]P7FFFFFFESC]PFFFFFFFESC[HESC[2JESC[HESC[2J/app/user1/DOMAINHOME

이로 인해 스크립트가 실패합니다.

이는 xterm에 색상을 제공하는 .bashrc의 색상 코드입니다. 약간의 조사 끝에 마지막 부분[HESC[2JESC[HESC[2J]경로를 출력하기 전에 터미널의 내용을 지우는 것입니다.

나는 이러한 현상이 왜 발생하는지 알아내려고 머리를 쥐어뜯었습니다. 어떤 아이디어가 있나요?

참고: user1로 로그인하면 이 변수가 정상적으로 표시됩니다.

답변1

"su -"를 사용하고 있으므로 실행 쉘은 로그인 쉘인 것처럼 가장합니다(시스템 /etc/profile, 사용자 프로필 등 .profile실행 .bash_profile). 이러한 스크립트 중 하나는 이스케이프 시퀀스(strings Esc]P)를 생성하고 결과를 표준 출력으로 인쇄합니다. 이렇게 해서는 안 됩니다.

해야 할 일은 쉘이 대화형인지 확인하는 것입니다.그 다음에——그때만! -- 이스케이프 시퀀스를 생성해야 합니다.

대화형 쉘을 확인하는 가장 좋은 방법은 "$-" 값을 확인하고 해당 문자가 포함되어 있는지 확인하는 것입니다. i포함되어 있으면 쉘은 대화형이고 그렇지 않으면 쉘은 그렇지 않습니다. 나는 보통 다음과 같은 것을 사용합니다 :

case "$-" in
*i*)  # Here if the shell is interactive
      ;;
*)    # Here otherwise
      ;;
esac

이스케이프 시퀀스를 생성한 항목을 확인해야 합니다. 일반적인 원인은 터미널 설정을 수정해야 하는 echo, 및 기타 명령입니다. tput인터넷 검색을 좀 했지만 특정 이스케이프 시퀀스를 찾을 수 없어서 어디서/무엇을 찾아야 할지에 대한 단서를 제공할 수 없습니다.

물론, 왜 사용하시겠습니까 su -? sudo -u user1추가 단계를 사용하고 제거하십시오 ( user1귀하의 요구 사항에 .profile 실행이 포함될 수 있지만 나도 모르고 귀하도 말하지 않았습니다).

관련 정보