쉘 스크립트에서 확인 표시와 십자 표시를 인쇄하고 싶습니다.
#!/bin/bash
echo -e "\xE2\x9C\x94 existing"
echo -e "\xE2\x9D\x8C missing"
왜 이것이 작동하지 않습니까?
답변1
댓글에서 OP 가 밝혔듯이 그들은 sh file.sh
./bin/sh
예를 들어 Ubuntu에서 기본 쉘은 dash
.
$ dash
$ printf "\xE2\x9C\x94 missing\n"
\xE2\x9C\x94 missing
$ echo -e "\xE2\x9C\x94"
-e \xE2\x9C\x94
대화형 셸에서 명령을 호출할 때 작동하는 이유는 기본적으로 사용자 대화형 셸(Ubuntu의 경우) 때문입니다./bin/bash
스크립트를 올바르게 실행하려면 다음이 필요합니다.
- 다음과 같이 실행
./file.sh
- 올바른 쉘에 대한 인수로 실행하십시오.
bash file.sh
또는 쉘 독립적 접근 방식이 가능합니다.
# this printf is standalone program, not shell built-in
$ /usr/bin/printf "\xE2\x9C\x94 check mark\n"
✔ check mark
$ python -c 'print "\xE2\x9C\x94 check mark"'
✔ check mark
$ perl -e 'print "\xE2\x9C\x94 check mark"'
✔ check mark
답변2
이는 \xE2\x9C\x94
U+2714의 UTF-8 인코딩입니다(체크표시 반복) 특징.
터미널의 문자 집합이 UTF-8이고 해당 문자 집합의 글꼴을 사용하는 경우 이 3바이트는 확인 표시로만 나타납니다.
터미널 에뮬레이터의 경우 사용하는 문자 세트는 일반적으로 시작 시 로케일의 문자 세트입니다. 해당 터미널에서 실행하는 셸의 로캘을 변경하지 않은 경우 어떤 언어를 사용하는지 알 수 있습니다.
locale charmap
printf
여러 구현은 GNU printf
와 printf
내장을 모두 지원 zsh
하며 (적어도 bash
데비안 기반 시스템의 lksh
POSIX 호환 변형 ):mksh
$ printf '\u2714\u274c\n'
✔❌
로케일의 문자 세트에 대한 올바른 인코딩으로 이러한 문자를 인쇄하십시오(ksh93의 printf
내장도 이 \uXXXX
표현을 지원하지만 로케일의 문자 세트에 관계없이 항상 UTF-8로 출력합니다). printf
이를 내장하고 확장된 이스케이프 시퀀스(아마도 포함)를 지원 echo
하는 쉘은 -e
일반적 \uXXXX
으로 해당 기능도 지원합니다.
이제 일반적인 GNU 시스템에서 사용할 수 있는 두 문자 세트인 AFAICT는 UTF-8과 GB18030(U+274C 및 U+2714 문자)입니다. 다른 문자 세트를 사용하는 로케일에서는 printf
이러한 문자가 존재하지 않기 때문에 표시되지 않습니다. 구현에 따라 문자 그대로 인쇄 printf
되거나 \u274C
오류와 함께 실패합니다.
일부 쉘( 원래 FreeBSD )도 참조에서 이 표기법을 지원합니다 zsh
.bash
ksh93
mksh
sh
\uXXXX
$'...'
그래서 당신은 이것을 할 수 있습니다 :
echo $'\u2714\u274c'
bash
셸에 따라 이는 명령을 구문 분석할 때( ), 명령을 실행할 때( ) 또는 항상 UTF-8(ksh)로 zsh
실행되는 로케일 인코딩 으로 확장됩니다.
POSIXly(Unix 계열 시스템에서 이식 가능)에서 임의의 바이트 시퀀스를 인쇄하려면 printf
및 8진수 표기법을 사용해야 합니다.
\xE2\x9C\x94
(U+2714의 UTF-8 인코딩)은 한 줄에 이식 가능하게 인쇄됩니다.
printf '\342\234\224\n'
해당 로캘에 맞는 올바른 인코딩으로 변환하려면 다음과 같이 하세요.
printf '\342\234\224\n' | iconv -f UTF-8
POSIX는 시스템이 지원하는 문자 인코딩이나 이름을 지정하지 않지만 위 명령은 일반적으로 UTF-8 인코딩을 지원하는 POSIX 시스템에서 작동합니다.
답변3
원시 "잘라내기 및 붙여넣기" 유니코드를 사용하면 더 읽기 쉬운 솔루션을 얻을 수 있습니다.
$ echo -e '☑ done\n☒ fail\n☐ to do'
☑ done
☒ fail
☐ to do