차이점이 뭐야
둘러싸기 옵션 값만 인용합니다.
예를 들어:
grep --file="grep pattern file.txt" *
그리고
옵션 이름과 옵션 값은 따옴표로 묶여 있습니다.
예를 들어:
grep "--file=grep pattern file.txt" *
?
그들은 동일한 결과를 낳습니다.
답변1
셸의 따옴표와 백슬래시는 특정 문자의 특수성을 제거하여 해당 문자가 일반 문자로 처리되도록 하는 데 사용됩니다.
큰따옴표의 특별한 점은 여전히 그 안에서 확장이 가능하다는 것입니다. 즉, 그 중에서도 $
, \
, 는 `
여전히 특별합니다. 또한 이러한 확장 프로그램의 성능에도 영향을 미칩니다.
이 줄에서 셸의 유일한 특수 문자는 다음과 같습니다.
- 쉘 구문(많은 언어에서와 마찬가지로)에서 공백은 특히 행, 인수의 경우 구문에서 단어를 구분하는 데 사용됩니다.간단한 명령(이것은 쉘에 알려진 여러 구조 중 하나이며 주요 구조입니다.)
- 끝에 있는 개행 문자는 무엇보다도 명령을 구분하는 데 사용됩니다.
*
전역 패턴 연산자인 , 간단한 명령줄에서 인용되지 않은 경우 이러한 문자가 있으면 다음과 같은 동작이 트리거됩니다.파일 이름 생성또는와일드카드또는경로명 확장(POSIX 문구).
다른 문자는 쉘 구문에서 특별한 의미가 없습니다.
여기서 우리가 원하는 것은 쉘이 /usr/bin/grep
다음 매개변수를 사용하여 파일을 실행하도록 하는 것입니다.
grep
--file=grep pattern file.txt
- 그리고 다음은 현재 작업 디렉터리에 있는 파일 목록입니다.
그래서 우리는 다음을 원합니다:
- 공간이 사이의 단어 구분 기호로 처리됩니다.
- 새로운 팀명령을 정의하다
*
전역 연산자로 취급되며 현재 작업 디렉터리에 숨겨지지 않은 파일로 확장됩니다.
따라서 위의 문자를 인용하면 안 됩니다.
그러나 그 중 두공간우리는 에 전달된 두 번째 인수에 포함되기를 원하므로 grep
따옴표로 묶어야 합니다. 따라서 최소한 다음이 필요합니다.
grep --file=grep' 'pattern' 'file.txt *
또는:
grep --file=grep" "pattern\ file.txt *
(다른 참조 연산자 표시)
여기서는 쉘에 특정한 2개의 문자만 인용하고 있으며, 그렇게 처리되는 것을 원하지 않습니다. 하지만 우리는 이렇게 할 수도 있습니다:
'grep' '--file=grep pattern file.txt' *
그리고 인용하다모두쉘이 특별하게 처리하기를 원하는 문자 이외의 문자입니다.
특수 문자가 아닌 문자를 인용해도 쉘에는 아무런 영향이 없습니다.
'g'r"ep" \-\-"file="'grep p'atte'\r\n\ file.txt *
여기에서 서로 다른 형태의 따옴표를 번갈아 사용해도 동일한 효과가 나타납니다.
명령 및 옵션² 이름에 셸 특수 문자가 포함되는 경우가 거의 없으므로 이를 인용하지 않는 것이 관례입니다. 'ls' '-l'
대신 of 를 사용하는 사람들을 거의 볼 수 없으므로 or 와 비교하면 별 차이가 없더라도 흔히 발생 ls -l
합니다 .grep --file="the value"
grep "--file=the value"
grep --file=the" value"
바라보다Unix 쉘에서 일반 문자와 같은 특수 문자를 사용하는 방법은 무엇입니까?어떤 문자가 특별한지, 다양한 쉘에서 이를 참조하는 방법에 대한 자세한 내용입니다.
이제 이 명령에는 여전히 몇 가지 문제가 있습니다.
- 첫 번째 확장자의 파일명이 로
*
시작하는 경우-
옵션으로 처리됩니다. *
유형에 관계없이 모든 파일을 확장합니다. 여기에는 디렉터리, 기호 링크, fifo 및 장치가 포함됩니다. 다음 유형의 파일만 보고 싶을 가능성이 높습니다.정기적인(또는 일반 파일에 심볼릭 링크할 수 있음)--file
GNU 교리입니다. 표준 동등물은 입니다-f
.*
하나의 파일로만 확장하는 경우grep
파일 이름과 일치하는 줄은 포함되지 않습니다.- 일치하는 파일이 없으면
*
bash(기본값)를 포함한 일부 쉘에서는*
리터럴 인수가 전달됩니다grep
(그리고 해당 이름의 파일을 열 수 없다고 불평할 수 있습니다).
따라서 여기서는 zsh 쉘을 예로 사용하여 다음과 같이 작성하고 싶습니다.
grep -f 'grep pattern file.txt' -- /dev/null *(-.)
어디:
-f
대신 사용됩니다--file
.--
옵션이 시작되더라도 뒤에 오는 다른 인수는 하나로 간주되지 않도록 옵션의 끝을 표시합니다-
.- 항상 파일 이름이 인쇄되도록
/dev/null
최소 2개의 파일을 전달하는 기능을 추가했습니다 .grep
- 우리는 단지 볼 수
*(-.)
있도록 사용합니다grep
정기적인문서. 일치하는 항목이 없으면zsh
중단불일치오류가 발생하고 grep이 실행되지 않습니다.
/dev/null
에 전달하므로 , 일치하는 항목이 없으면 오류를 보고하고 내부를 살펴보는 대신 (자동으로 실패하는 대신) glob이 아무것도 확장되지 않도록 하는 glob 한정자( ) grep
도 추가할 수 있습니다 .N
*(N-.)
grep
/dev/null
while
1 , 와 같은 셸 구문에서 키워드를 인용하면 셸이 이를 유사하게 인식하지 못하게 되고 do
유효 하지 않기 때문에 셸이 이를 변수 할당으로 처리하지 못하게 되므로 영향을 미칠 수 있습니다. (그리고 구문 분석 후 인용이 수행됩니다.) 또는 별칭을 작성하거나 인용된 형식의 별칭이 없으면 별칭이 확장되지 않습니다 (이 작업을 허용하는 쉘은 거의 없음).if
time
'v'ar=value
'v'ar
foo
\foo
f'oo'
-?
²Microsoft에서 영감을 받은 유틸리티는 때때로 주목할만한 예외를 발견합니다.
3 GNU의 경우 grep
이는 첫 번째 인수뿐만 아니라 다른 인수에도 적용됩니다. 왜냐하면 GNU grep
(및 현재 일부 다른 GNU 유사 구현)는 옵션이 아닌 인수 이후에도 옵션을 허용하기 때문입니다.