다른 쉘에서 백슬래시를 echo
처리하는 방법은 무엇입니까 ?printf
zsh
bash
아래에嘚다음과 같은 동작이 나타납니다.
$ echo "foo\bar\baz"
foaaz
$ echo "foo\\bar\\baz"
foaaz
$ echo 'foo\bar\baz'
foaaz
$ echo 'foo\\bar\\baz'
foo\bar\baz
아래에세게 때리다, 상황이 더 일관되게 보입니다.
bash$ echo "foo\bar\baz"
foo\bar\baz
bash$ echo 'foo\bar\baz'
foo\bar\baz
bash$
하지만 더 구체적으로 말하면:다음과 같은 백슬래시가 포함된 문자열을 전달하는 방법\\foo\bar\something
도착하다:
echo
printf
print
똑같은 문자열을 얻으시겠습니까?(와 zsh
함께 bash
)?
다음은 zsh의 기능을 사용한 또 다른 실험입니다.
function foo
{
echo -E '$1'
}
$ foo \\here\is\some\path
$1
어떻게 인쇄할 수 있나요 \\here\is\some\path
?
업데이트 (참고: Stephen의 의견에서 답변되었습니다)
zsh 5.0.2에서 다음을 시도했습니다.
function foo
{
printf '$s\n' $1
}
foo '\\some\path'
하지만 이것은 출력됩니까 $s
?
답변1
zsh
echo
bash
UNIX 모드와 마찬가지로 표준 모드에서 실행됩니다 . 즉, \b
UNIX 사양에서 요구하는 대로 ASCII BS 문자로 확장됩니다.
echo
임의의 문자열을 표시 하는 데 사용하지 말고 다음을 사용하십시오.printf
:
printf '%s\n' "$1"
print -r -- "$1"
또한 유효하지만 ksh
/는 zsh
구체적입니다.
echo -E - "$1"
zsh
나는 그것이 일부 BSD에서 작동한다고 믿습니다.
cat << EOF
$1
EOF
printf
Bourne과 같은 셸에서 작동합니다. 심지어 수십 년 전에는 명령이 없었던 셸에서도 작동 하지만 새로운 프로세스를 생성하고 printf
현재 모든 곳에 있으므로 실제로는 필요하지 않습니다.
rc
그런데 백슬래시는 쉘( python 을 제외한 모든 쉘 ) 에 특별하기 때문에 쉘 명령줄에서 이스케이프 처리해야 합니다 .
$ foo '\\foo\bar'
foo \\foo\bar
누락된 백슬래시를 다시 만들 수 없는 "\foo\bar"
문자열을 전달 합니다 .foo
답변2
새로운 답변: read -r var
-r raw input - disables interpretion of backslash escapes and line-continuation in the read data
다음을 표시합니다.
printf "%s" "$var"
echo "$var"
작동해야합니다.
따라서 foo 기능의 경우:
function foo
{
read -r var
echo -E "var is : ${var}"
}
$ foo
\\here\is\some\path
var is : \\here\is\some\path
아래의 이전 답변(답변은 아니지만 유용할 수도 있습니다 ^^)
각각을 교체하여 \
쉘 \\
에 " \
내가 원하는 것입니다"라고 알리십시오. 그렇지 않으면(귀하의 예에서 zsh와 같이) \b
"1 백스페이스" 등을 의미할 가능성이 높습니다.
예를 들어 sed를 사용할 수 있습니다.
sed -e 's,\\,\\\\,g' < the_original > the_escaped_backslaches_version
(여기서 어떻게 "\"를 이스케이프 처리해야 하는지 확인하고 sed에게 "내가 원하는 문자 그대로의 "\"입니다.) (Shell이 대부분을 해석하지 않도록 " " 대신 ' '로 묶었습니다. 또한)
답변3
일반적으로 백슬래시 때문에 할 수 없습니다.예이스케이프 문자(따라서 리터럴 값이 필요한 경우 이스케이프해야 함) BASH는 이러한 목적으로 작은따옴표를 제공하지만 작은따옴표로 묶인 문자열 내에서는 이스케이프된 작은따옴표를 사용할 수 없습니다.
차이점 은 echo
내장되어 있으며 쉘에 따라 (어느 정도) 다르게 동작할 수 있다는 것입니다. 예를 들어 BASH 내장에는 -e
백슬래시 시퀀스를 해석하도록 지시하는 옵션이 있습니다. 이를 사용하면 Z 쉘에서 볼 수 있는 동작을 얻을 수 있습니다.