옵션 값을 따옴표로 묶는 것과 옵션 이름 및 옵션 값을 따옴표로 묶는 것의 차이점은 무엇입니까?

옵션 값을 따옴표로 묶는 것과 옵션 이름 및 옵션 값을 따옴표로 묶는 것의 차이점은 무엇입니까?

차이점이 뭐야

  • 둘러싸기 옵션 값만 인용합니다.

    예를 들어:grep --file="grep pattern file.txt" *

그리고

  • 옵션 이름과 옵션 값은 따옴표로 묶여 있습니다.

    예를 들어:grep "--file=grep pattern file.txt" *

?

그들은 동일한 결과를 낳습니다.

답변1

셸의 따옴표와 백슬래시는 특정 문자의 특수성을 제거하여 해당 문자가 일반 문자로 처리되도록 하는 데 사용됩니다.

큰따옴표의 특별한 점은 여전히 ​​그 안에서 확장이 가능하다는 것입니다. 즉, 그 중에서도 $, \, 는 `여전히 특별합니다. 또한 이러한 확장 프로그램의 성능에도 영향을 미칩니다.

이 줄에서 셸의 유일한 특수 문자는 다음과 같습니다.

  • 쉘 구문(많은 언어에서와 마찬가지로)에서 공백은 특히 행, 인수의 경우 구문에서 단어를 구분하는 데 사용됩니다.간단한 명령(이것은 쉘에 알려진 여러 구조 중 하나이며 주요 구조입니다.)
  • 끝에 있는 개행 문자는 무엇보다도 명령을 구분하는 데 사용됩니다.
  • *전역 패턴 연산자인 , 간단한 명령줄에서 인용되지 않은 경우 이러한 문자가 있으면 다음과 같은 동작이 트리거됩니다.파일 이름 생성또는와일드카드또는경로명 확장(POSIX 문구).

다른 문자는 쉘 구문에서 특별한 의미가 없습니다.

여기서 우리가 원하는 것은 쉘이 /usr/bin/grep다음 매개변수를 사용하여 파일을 실행하도록 하는 것입니다.

  1. grep
  2. --file=grep pattern file.txt
  3. 그리고 다음은 현재 작업 디렉터리에 있는 파일 목록입니다.

그래서 우리는 다음을 원합니다:

  • 공간이 사이의 단어 구분 기호로 처리됩니다.
  • 새로운 팀명령을 정의하다
  • *전역 연산자로 취급되며 현재 작업 디렉터리에 숨겨지지 않은 파일로 확장됩니다.

따라서 위의 문자를 인용하면 안 됩니다.

그러나 그 중 두공간우리는 에 전달된 두 번째 인수에 포함되기를 원하므로 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 및 장치가 포함됩니다. 다음 유형의 파일만 보고 싶을 가능성이 높습니다.정기적인(또는 일반 파일에 심볼릭 링크할 수 있음)
  • --fileGNU 교리입니다. 표준 동등물은 입니다 -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


while1 , 와 같은 셸 구문에서 키워드를 인용하면 셸이 이를 유사하게 인식하지 못하게 되고 do유효 하지 않기 때문에 셸이 이를 변수 할당으로 처리하지 못하게 되므로 영향을 미칠 수 있습니다. (그리고 구문 분석 후 인용이 수행됩니다.) 또는 별칭을 작성하거나 인용된 형식의 별칭이 없으면 별칭이 확장되지 않습니다 (이 작업을 허용하는 쉘은 거의 없음).iftime'v'ar=value'v'arfoo\foof'oo'

-?²Microsoft에서 영감을 받은 유틸리티는 때때로 주목할만한 예외를 발견합니다.

3 GNU의 경우 grep이는 첫 번째 인수뿐만 아니라 다른 인수에도 적용됩니다. 왜냐하면 GNU grep(및 현재 일부 다른 GNU 유사 구현)는 옵션이 아닌 인수 이후에도 옵션을 허용하기 때문입니다.

관련 정보