.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
하십시오 .)zsh
sh
$'...'
또는 다음 구문을 사용하세요.
log() {
RED='\e[0;31m'
RESET='\e[0m'
printf '%b%s%b %s\n' "$RED" "$(date)" "$RESET" "$*" >> "$HOME"/mylog.txt
}
의 확장은 의 "$*"
현재 값에 따라 달라집니다 $IFS
.
어떤 경우 에라도,echo
임의의 데이터는 피하는 것이 가장 좋습니다.