![다른 사용자의 변수를 에코할 때 이상한 출력](https://linux55.com/image/64403/%EB%8B%A4%EB%A5%B8%20%EC%82%AC%EC%9A%A9%EC%9E%90%EC%9D%98%20%EB%B3%80%EC%88%98%EB%A5%BC%20%EC%97%90%EC%BD%94%ED%95%A0%20%EB%95%8C%20%EC%9D%B4%EC%83%81%ED%95%9C%20%EC%B6%9C%EB%A0%A5.png)
$ 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 실행이 포함될 수 있지만 나도 모르고 귀하도 말하지 않았습니다).