쉘 명령은 터미널과 스크립트에서 다르게 실행됩니다.

쉘 명령은 터미널과 스크립트에서 다르게 실행됩니다.

다음 명령 순서

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

bashkshLinux에서는 두 개의 백슬래시를 인쇄합니다 .

$shell -x 출력을 보면 백슬래시가 올바른 출력이라고 생각됩니다.

kshLinux에서 왜 이렇게 작동하는지 모르겠습니다 . 행동을 모방하려고 할 수도 있습니다 bash.

이 동작 에 대한 설명 bash은 bash에 POSIX가 아닌 구현이 있고 echoPOSIX에서 요구하는 대로 백슬래시를 해석하지 않는다는 것입니다.

bashPOSIX는 소규모 임베디드 시스템에서만 동작을 허용합니다. 그렇지 않은 경우 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.

관련 정보