나는 특정 명령에서 백슬래시가 어떻게 사용되는지 더 잘 이해하려고 노력해 왔습니다. 특수 문자(예: )를 이스케이프하는 데 사용되는 것은 이해 echo 'that'\''s no moon'
하지만 다른 명령의 출력은 약간 혼란스럽습니다. 예를 들어:
rpm-qa rpmname\*
grep '\s/tmp' /etc/fstab
누군가 내가 이 문제를 해결하도록 도와줄 수 있나요? 또한 당신이 알고 있는 다른 용도에 대해서도 궁금합니다. 감사합니다!
답변1
백슬래시는 "다음 문자에 특별한 의미를 부여하기보다는 그 자체를 나타내도록 한다"는 의미로 자주 사용됩니다. 우리는 백슬래시라고 해인용 부호다음 캐릭터. 이 의미는 쉘 구문을 포함하여 많은 프로그래밍 언어에 존재합니다. 예를 들어 에서 rpm-qa rpmname\*
백슬래시를 사용하면 문자가 명령 인수 *
로 전달됩니다 . rpm-qa
대신, 현재 디렉토리에서 .로 rpm-qa rpmname*
대체하십시오 . (일치하는 파일이 없으면 bash는 나타나지 않습니다 . 기본적으로 zsh는 일치하는 파일이 없다고 불평합니다.)rpmname*
rpmname
rpmname*
쉘은 문자를 문자 그대로 해석하는 또 다른 방법, 즉 특별한 방식으로 해석되기보다는 그 자체를 표현하는 방법을 제공합니다. 이것은 전체 문자 시퀀스의 특별한 의미를 제거하는 인용입니다. 따옴표에는 두 가지 종류가 있습니다. 작은 따옴표는 '
각 문자가 다음 작은 따옴표까지 그 자체를 나타내도록 하는 반면, 큰 따옴표는 "
몇몇 문자( , , 및 ) 에 대해 "
특별한 $
의미를 갖습니다. 에서 명령은 (특정 경우에 특별한 의미를 갖는 문자가 아닌 리터럴 문자열로 작성됨)을 연결한 인수를 받습니다(백슬래시 작은따옴표는 특별한 의미를 취소하므로 작은따옴표로 확장됩니다). 문자) 및 (공백은 따옴표 안에 있기 때문에 특별한 의미를 잃습니다. 매개변수를 구분하지 않고 매개변수의 일부입니다).\
`
echo 'that'\''s no moon'
echo
that
'
s no moon
셸에서 백슬래시가 특별한 의미를 갖는 경우 일반적으로 다음 문자를 인용하는 것입니다. 하지만:
- 작은따옴표 내에서 백슬래시는 특별한 의미가 없습니다.
- 큰 따옴표 내에서 백슬래시는 다음 문자가 하나인 경우에만 따옴표를 붙입니다
"$\`
. 그렇지 않으면 백슬래시와 다음 문자는 문자 그대로"\a"
두 문자 로 해석됩니다\a
. - 달러 작은따옴표 리터럴에서 백슬래시는 다음과 같은 다른 의미를 갖습니다.씨. 백슬래시 뒤에 8진수 또는 특정 문자가 오면 문자를 입력하는 대체 방법을 제공하며 이는 인쇄할 수 없는 문자에 유용합니다. 예를 들어 백슬래시+n인
\n
소문자 N이지만 개행 문자입니다."\n"
$'\n'
에서는 grep '\s/tmp' /etc/fstab
작은따옴표로 인해 grep
매개변수가 수신 됩니다 \s/tmp
. 이 주장은정규식. 정규식에는 다양한 구문 변형이 있지만 대부분은 다음 두 가지 기준 중 하나를 기반으로 합니다.POSIX 기본 정규식(BRE) 및 확장 정규식(ERE). ERE는 백슬래시 뒤에 문자나 숫자 이외의 문자를 사용하여 다음 문자를 참조하는 광범위한 규칙을 따릅니다. 그러나 역사적 이유로 인해 BRE에서는 백슬래시가 특별한 경우가 아닌데도 다음 문자를 특별하게 만드는 경우가 있습니다. 이 경우 \s
BRE 및 ERE에 사용할 수 있는 기본 정규식 구문의 GNU grep 확장은 공백 문자를 나타냅니다. 따라서 앞에 공백이나 탭이 있는 줄이 나열됩니다 grep '\s/tmp' /etc/fstab
./etc/fstab
/tmp
답변2
나는 당신이 bash 또는 이와 유사한 것을 사용하고 있다고 가정합니다.
먼저, bash가 입력을 평가하는 방법을 이해해야 합니다. Bash에서는 많은 특수 문자를 사용할 수 있습니다. 예를 들어, 그들 중 일부는 다음과 같습니다* ; ~ $
입력하는 동안 bash는 대체되어야 하는 모든 문자를 대체하려고 시도합니다. 예를 들어 $
기호로 시작하는 변수입니다. *
현재 디렉토리에 존재하는 모든 파일/디렉토리로 대체됩니다( OK 사용 ) pwd
.
교체 단계가 완료되면 bash는 최종적으로 fork()
지정한 프로그램을 실행합니다.
\
지정된 특수 문자를 무시하도록 bash에 지시합니다 .\*
답변3
맞습니다. 백슬래시를 사용하여 문자를 이스케이프하거나 해당 문자가 특별한 의미를 가지며 이를 문자 그대로 사용하려는 일반적인 관례가 있습니다.
# echo 'It\'s a string!'
위의 예에서 아포스트로피는 리터럴 문자열을 구분하는 데 사용되지만 문자열에는 아포스트로피가 필요하므로 이스케이프해야 합니다.
다른 경우는 그 반대입니다. 특별한 의미를 갖기 위해 "일반" 문자가 필요한 경우입니다.
# grep '\s/tmp' /etc/fstab
위의 예에서 백슬래시는 grep에게 s
특별한 의미가 있고 리터럴이 아님을 알려줍니다 s
(정규 표현식 공백: 공백, 탭, 줄 바꿈, 캐리지 리턴, 수직 탭).
즉, 문자에 두 가지 의미가 있을 때 이스케이프하여 두 번째 의미를 갖게 됩니다.
편집하다:
첫 번째 예는 다음과 같습니다.
rpm-qa rpmname\*
여기에는 특별한 의미("rpmname"으로 시작하는 모든 것)가 있지만 셸이 이를 확장하려는 것을 방지하려면 명령이 리터럴을 가져와 그에 따라 처리할 수 있도록 *
이스케이프해야 합니다 .rpm
*
이로 인해 문자열이 여러 번 해석되고 문자열이 여러 명령에 의해 전달될 때 실제로 어려움을 겪을 수 있습니다.
답변4
\
특수 문자를 이스케이프하고 정규식을 트리거하는 데 사용됩니다 .
귀하의 rpm
명령은 escaping 중입니다 *
. 이 경우 이스케이프하지 않는 것과 동일하게 작동합니다. RPM은 이것이 *
잘못된 패키지 문자임을 알고 있으므로 이스케이프하더라도 이를 해석합니다. 이스케이프된 특수 문자는 영숫자가 아닌 파일 이름과 같은 상황에서 더 일반적으로 사용됩니다.
"foo-biz-bar"라는 이름의 파일과 "foo*bar"라는 이름의 파일이 있고 "foo*bar"만 보고 싶다고 가정해 보겠습니다. 아래의 첫 번째 결과는 blob 와일드카드가 이스케이프되지 않았기 때문에 발생합니다 *
.
$ ls foo*bar
foo*bar foo-biz-bar
$ ls foo\*bar
foo*baz
\s
예제에 있는 것은 grep
탭과 공백인 "모든 공백"을 의미하는 정규식입니다.
추가 읽기
온라인에서 정규 표현식의 전체 목록을 얻는 것은 어렵지만 시작할 수는 있습니다.여기.
나에게 많은 도움을 준 책은 "Unix Shells by 예제"이다. sed
, grep
및 의 광범위한 사용법 awk
도 다룹니다.