Composer가 추가한 패키지에서 다음 스크립트 줄을 찾았습니다.
dir=$(echo $dir | sed 's/ /\ /g')
Git Bash에서 시도해 보았습니다.
$ echo $(echo "foo\bar\ foo/baz/ qux\\bax\\ " | sed 's/ /\ /g')
foo\bar\ foo/baz/ qux\bax\
이것이 어떻게 작동하는지 설명해 주실 수 있나요? 이중 백슬래시와 일치하는 항목이 없습니다.
편집하다.
이제 내 실수가 보입니다. echo에서 이중 백슬래시를 단일 백슬래시로 바꾸는 것은 sed와 아무 관련이 없습니다.
od
Git Bash에는 없지만 시도해 보았습니다.
$ echo "foo\bar\ foo/baz/ qux\\bax\\ " >in.txt
$ echo $(echo "foo\bar\ foo/baz/ qux\\bax\\ " | sed 's/ /\ /g') >out.txt
$ cmp -l in.txt out.txt
27 40 12
cmp: EOF on out.txt
. 보다 out.txt
한 문자 더 짧습니다 in.txt
.
sed 's/ /\ /g'
그러나 나는 아직도 그것이 실제로 무엇을 하는지, 왜 하는지 이해하지 못합니다 .
전체 맥락이 청중에게 유용한가?
#!/usr/bin/env sh
dir=$(d=${0%[/\\]*}; cd "$d"; cd "../squizlabs/php_codesniffer/scripts" && pwd)
# See if we are running in Cygwin by checking for cygpath program
if command -v 'cygpath' >/dev/null 2>&1; then
# Cygwin paths start with /cygdrive/ which will break windows PHP,
# so we need to translate the dir path to windows format. However
# we could be using cygwin PHP which does not require this, so we
# test if the path to PHP starts with /cygdrive/ rather than /usr/bin
if [[ $(which php) == /cygdrive/* ]]; then
dir=$(cygpath -m $dir);
fi
fi
dir=$(echo $dir | sed 's/ /\ /g')
"${dir}/phpcs" "$@"
답변1
이것은 sed
관련이 없습니다. 당신이 보는 것은 실제로 echo
그 자체로 이루어집니다.
$ echo "foo\bar\ foo/baz/ qux\\bax\\ "
foo\bar\ foo/baz/ qux\bax\
\
다른 문자를 이스케이프하는 데 사용되기 때문입니다 . \\
"escape"를 의미하므로 하나만 \
인쇄됩니다. sed
입력 공간 탈출과 같은 유용한 작업을 수행 하려면 다음이 필요합니다.
$ echo "foo\bar\ foo/baz/ qux\\bax\\ " | sed 's/ /\\ /g'
foo\bar\\ foo/baz/\ qux\bax\\
답변2
sed는 이중 백슬래시를 보지 못할 수도 있으며 에코를 통해 하나로 병합됩니다. 설명에는 여러 수준이 있습니다. 여기서 쉘은 중요하지 않지만 echo 버전에 따라 echo가 중요합니다. 따라서 printf를 사용하는 것이 더 좋지만 printf는 첫 번째 인수도 해석한다는 점에 유의하세요. 다양한 상황에서 sed에 입력되는 내용을 살펴보세요.
$ echo "foo\bar\ foo/baz/ qux\\bax\\ " | od -t c
0000000 f o o \b a r \ f o o / b a z /
0000020 q u x \ b a x \ \n
0000033
$ printf "foo\bar\ foo/baz/ qux\\bax\\ " | od -t c
0000000 f o o \b a r \ f o o / b a z /
0000020 q u x \ b a x \
0000032
$ printf '%s\n' foo\bar\ foo/baz/\ qux\\bax\\ | od -t c
0000000 f o o b a r f o o / b a z /
0000020 q u x \ b a x \ \n
0000031
$ printf '%s\n' "foo\bar\ foo/baz/ qux\\bax\\ " | od -t c
0000000 f o o \ b a r \ f o o / b a z
0000020 / q u x \ \ b a x \ \ \n
0000036
네 번째 것만 이중 백슬래시를 전송합니다. 이 백슬래시는 먼저 echo에 의해 제거되고 그 다음에는 printf에 의해 제거되고 세 번째는 셸에 의해 제거됩니다.