다음 명령 순서
ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
echo $ch
터미널이나 source
출력 에서 실행될 때
b\\_d
scipt로 실행할 때
sh script.sh
스크립트 내용은 다음과 같습니다.
#!/bin/bash
ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
echo $ch
출력은 다음과 같습니다
b\_d
터미널의 출력이 기본 출력입니다. 쉘 스크립트를 사용하는 솔루션은 무엇입니까? 수정 방법에 대한 아이디어도 답변으로 허용됩니다.
ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
을 위한 sh
.
나는 bash 쉘을 사용합니다 :
echo $0
bash
답변1
sh
다르고 bash
다르게 행동합니다.
sh
그렇게 생각해요 dash
.
참고: 이 명령은 다른 쉘을 확인하면 다르게 작동합니다.
bosh
, dash
, mksh
및 Solaris에서 백슬래시를 인쇄합니다 zsh
.ksh
bash
ksh
Linux에서는 두 개의 백슬래시를 인쇄합니다 .
$shell -x 출력을 보면 백슬래시가 올바른 출력이라고 생각됩니다.
ksh
Linux에서 왜 이렇게 작동하는지 모르겠습니다 . 행동을 모방하려고 할 수도 있습니다 bash
.
이 동작 에 대한 설명 bash
은 bash에 POSIX가 아닌 구현이 있고 echo
POSIX에서 요구하는 대로 백슬래시를 해석하지 않는다는 것입니다.
bash
POSIX는 소규모 임베디드 시스템에서만 동작을 허용합니다. 그렇지 않은 경우 POSIX에서는 소위 확장 구현이 필요합니다 . XSI
이를 위해서는 AT&T가 1982년 SYSv에 대해 구현한 동작을 정확히 따라야 합니다 echo
.echo
중요한 힌트:
다음으로 시작하는 스크립트가 있는 경우
#!/bin/bash
호출하면 x
비트 세트에 따라 실행 가능합니다 .chmod
sh myscript
/bin/sh
스크립트는 여전히 Linux에서 실행됩니다 dash
. 따라서 코드를 실행하는 방법에 주의하세요.
문제를 피할 수 있는 방법이 있습니다. 다음을 사용하도록 스크립트를 변경하십시오.
ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
printf '%s\n' $ch
echo
이렇게 하면 1989년에 발생한 문제를 피할 수 있습니다 bash
. printf
버그가 있는 구현이 많기 때문에 여전히 모든 문제가 해결되지는 않지만 인수의 백슬래시로 인해 발생하는 일반적인 문제는 영향을 받지 않습니다 printf
.