echo -e의 이스케이프 문자

echo -e의 이스케이프 문자

.bashrc로그에 사용하는 파일의 내용은 다음과 같습니다.

function log(){

  RED="\e[0;31m"
  RESET="\e[0m"
  echo -e "${RED}$(date)" "${RESET}$*" >> "$HOME"/mylog.txt
}

그러나 아포스트로피를 사용하여 작업을 수행하면 일종의 힌트가 표시되고 올바르게 기록되지 않습니다.

파일에 입력된 모든 텍스트를 어떻게 이스케이프할 수 있나요?

예:

$ log this is a testing's post
> hello
> 
> ^C
$

감사해요.

답변1

echo -e귀하가 겪고 있는 문제는 귀하의 log()기능과 관련이 없습니다. 문제는 아포스트로피입니다.

log this is a testing's post

쉘(귀하의 경우 bash)은 특정 문자에 대해 특별한 의미를 갖습니다. 아포스트로피(작은따옴표)는 전체 문자열을 인용하는 데 사용되며 대부분의 다른 유형의 보간을 방지합니다.bash는 그들이 쌍으로 오기를 원합니다.이것이 바로 두 번째 프롬프트 줄을 입력할 때까지 추가 프롬프트 줄이 표시되는 이유입니다. 문자열에 작은따옴표를 사용하려면 \'다음과 같이 이스케이프 처리하여 bash에 알려야 합니다.

log this is a testing\'s post

다시 말하지만, log그게 요점이 아닙니다. echo원하는 경우 기존 방식으로 시도해 볼 수 있습니다.

echo this is a testing\'s post

바라보다Bash에서 이스케이프해야 하는 문자더 많은 정보를 알고 싶습니다.

답변2

문제는 입력한 명령줄에 일치하지 않는 작은따옴표 문자가 포함되어 있기 때문입니다. 와는 아무 관련이 없습니다 echo. 쉘은 두 번째 프롬프트를 발행하여 다음으로 시작하는 작은따옴표 문자열이 끝날 때까지 기다리고 있음을 알려줍니다.'s po...

'함수에 자유롭게 전달하려면 이스케이프 처리해야 합니다 log.

log "this is a testing's post"

또는:

log this is a testing\'s post

예를 들어.

이제 필요한 곳에탈출하다문자는 echo -e백슬래시 문자입니다. 예를 들어 호출하면 log '\begin'BS \b문자로 변환됩니다 echo -e.

이 문제를 해결하기 위해 이스케이프 시퀀스를 \e확장된 이스케이프 시퀀스와 함께 다음 변수에 저장할 수 있습니다.

log() {
  RED=$'\e[0;31m'
  RESET=$'\e[0m'
  printf '%s\n' "${RED}$(date) ${RESET}$*" >> "$HOME"/mylog.txt
}

( 아직 POSIX를 채택하지 않은 구문을 나타내려면 여기에서 bash, ksh93또는 FreeBSD 구문을 사용 mksh하십시오 .)zshsh$'...'

또는 다음 구문을 사용하세요.

log() {
  RED='\e[0;31m'
  RESET='\e[0m'
  printf '%b%s%b %s\n' "$RED" "$(date)" "$RESET" "$*" >> "$HOME"/mylog.txt
}

의 확장은 의 "$*"현재 값에 따라 달라집니다 $IFS.

어떤 경우 에라도,echo임의의 데이터는 피하는 것이 가장 좋습니다.

관련 정보