본 같은 껍질

본 같은 껍질

"큰따옴표 문자(")를 어떻게 입력하나요? 가 요청되고 있으며 동일한 답변으로 커뮤니티를 화나게 하고 싶지 않습니다. ( s \"에 포함되지 않은 경우 입력하고 s 에 포함된 경우 '입력하세요 .) 따라서 질문은 다음과 같습니다."'

일반 문자처럼 터미널에 특수 문자를 입력할 수 없습니다. 예를 들어 이 명령은 실패합니다.

echo Updates (11)

그렇다면 터미널에서 일반 문자처럼 이러한 문자를 어떻게 입력합니까?

!#$^&*?[](){}<>~;'"\|<space><tab><newline>

답변1

많은 것은 케이싱에 달려 있습니다. 자세한 내용은 쉘 설명서를 확인하세요.

또한 일부 문자는 특정 상황에서만 특별하다는 점에 유의하세요. 예를 들어, 대부분의 셸에서는 목록 컨텍스트에서만 특별하고 POSIX 또는 csh와 같은 셸에서는 *단어 시작이나 뒤에 특정 문자(예: )만 있습니다 . 에도 동일하게 적용됩니다 . 일부 셸에서는 와 일치할 때만 특별합니다(일부 제한 사항 있음) .?~:=zsh[]

일부 쉘(예: bash또는 ) 에서는 yash특수 문자(예: 공백 표시 구분 기호)도 로케일 설정에 따라 다릅니다.

인용 연산자(이러한 문자의 특별한 의미를 제거하기 위한)도 쉘마다 크게 다릅니다.

본 같은 껍질

shBourne과 유사한 쉘(즉, 1980년대 이후 일부 시스템에서 호출되는 것으로 알려진 쉘) 요약:

본 쉘

특수 문자:

  • "'&|;()^`<>$, 공백, 개행 및 탭은 따옴표가 없는 경우 간단한 명령줄에서 특별합니다.
  • #(이전 버전 제외) 줄 시작 부분에 공백, 탭 또는 &|()^<>;`.
  • {의 특별한 점 은 }셸 키워드(따라서 명령 위치에 있는 단어만)라는 것입니다.
  • *?[와일드카드로 특별하므로 목록 컨텍스트에서만 가능합니다. 와일드카드인 경우에는 인용하거나 [특별한 의미 를 제거하면 됩니다.[...][]
  • =이는 할당 연산자의 맥락에서 볼 때 특별합니다. 즉, 간단한 명령에서 set -k인수를 따르지 않는 모든 단어( 이후 제외)에 대해 적용됩니다.

참조 연산자

  • \줄 바꿈을 제외한 모든 특수 문자를 인용하는 것은 \<newline>매우 긴 문자를 계속하는 방법입니다.논리적다음으로 이동물리적시퀀스를 삭제하려면 행). 백틱은 \처음에 닫는 백틱을 이스케이프 처리하고 파서를 돕는 데 사용되기 때문에 복잡성을 더한다는 점에 유의하세요 . 큰따옴표 내에서는 \자체를 이스케이프하는 데에만 사용할 수 있으며, "( $여전히 줄 연속 문자)입니다 `. \<newline>이 문서 내 에서 문자를 이스케이프하는 유일한 방법은 ".\
  • "..."\큰따옴표는 자신 , $및 를 제외한 모든 문자를 이스케이프합니다 `.
  • '...'작은따옴표는 자신을 제외한 모든 문자를 이스케이프합니다.

POSIX 쉘

POSIX 셸의 동작은 다음을 제외하면 기본적으로 Bourne 셸과 유사합니다.

ksh

다음을 제외하고 POSIX와 유사합니다.

  • {string},문자열에 따옴표가 포함되어 있지 않은 경우(또는 ..일부 경우 및 일부 버전) 특별합니다.
  • $'...'ksh93에는 복잡한 규칙을 사용하는 추가 특수 참조 연산자가 있습니다 . 이 연산자는 bashFreeBSD zsh, FreeBSD 및 busybox mksh에서도 찾을 수 있습니다(일부 변형 있음) sh.
  • ksh93$"..."문자열을 현지화해야 한다는 점을 제외하면 유사하게 작동하는 참조 연산자 도 있습니다 "..."(사용자 언어로 변환하도록 구성할 수 있음). 에서는 mksh무시하세요 .$$"..."
  • ksh93rcsh 스타일 기록 확장은 대화형 셸에서 지원 되므로 ksh93(기본적으로 활성화되지 않음) 명령 시작이 특별해집니다. 일부 상황에서는 특별하며(공백이나 TAB이 뒤에 올 때나 이 문서에서는 그렇지 않음) 큰따옴표로 이스케이프되지 않습니다. 백슬래시(특별한 의미를 제거하는 큰따옴표가 아닌)와 작은따옴표만 이스케이프됩니다.-H-o histexpand^!!\!

bash

다음과 같지만 ksh93:

  • 단일 바이트 문자 로케일에서는 모든공백(로케일에 따라) 문자는 구분 기호(예: 공백 또는 탭)로 처리됩니다. 실제로 이는 일부 로케일에서 공백 문자일 수 있는 경우 비트 8이 설정된 모든 바이트를 인용해야 함을 의미합니다.
  • csh 기록 확장은 위의 ksh93과 동일한 주석을 사용하여 대화형 인스턴스에서 기본적으로 최신 버전에서만 활성화되며 bash, !뒤에 ".
  • csh와 마찬가지로 %작업을 수행하기 위해 명령 시작 부분에 사용됩니다. 명령을 %1실행하는 대신 첫 번째 작업을 포그라운드로 가져옵니다 . 배경에 넣어도 %1마찬가지 ..%1 &

zsh

다음과 같지만 ksh93:

  • 백슬래시를 제외하고는 csh 기록 확장과 동일한 주석을 사용하여 csh에서와 마찬가지로 큰따옴표 내에서 이스케이프 bash할 수 있습니다 .!
  • =단어의 첫 번째 문자( =ls로 확장됨 /bin/ls)가 특별하기 때문입니다.
  • %명령 위치의 bash와 동일한 설명입니다.
  • {그리고 }분리되지 않은 경우 명령 그룹을 열고 닫는 것도 가능합니다( {echo text}Bourne의 작업에서처럼 { echo text;}).
  • [특별한 경우를 제외하고는 [로 끝나지 않더라도 인용은 필수입니다 ].
  • extendedglob옵션이 활성화되면 , #^~와일드카드 연산자입니다.
  • braceccl옵션을 사용하면 {non-empty-string}특별합니다.
  • $"..."지원하지 않습니다.
  • 특이한 점은 ?단어 시작 부분(또는 인용 또는 확장) 뒤에 a가 오는 경우(작업 사양을 허용하기 위해) 특별하지 않다는 것입니다.%%?name
  • 옵션 rcquotes(기본적으로 활성화되지 않음)을 사용하면 ''작은따옴표 안에 작은따옴표를 입력 할 수 있습니다 rc(아래 참조).

yash

그거 빼고요 POSIX.

  • 모든 공백 문자는 구분 기호로 간주됩니다.
  • brace-expandzsh 스타일 중괄호 확장을 구현하려면 이 옵션을 사용하십시오 .
  • 명령 위치의 bash 및 zsh와 동일한 설명입니다 %(POSIX 모드 제외).

모든 쉘과 마찬가지로 인용이 다르게 작동하는 특별한 상황이 있습니다. 여기서는 이미 문서와 백틱을 언급했지만 [[...]]ksh 및 기타 셸, POSIX 구문 에도 이러한 항목 $((...))이 있습니다.case

또한 확장(큰따옴표 사용) 또는 여기에 적용된 문서 구분 기호와 관련하여 인용은 다른 부작용이 있을 수 있습니다. 또한 예약어를 비활성화하고 별칭 확장에 영향을 줍니다.

일반화하다

Bourne과 같은 쉘에서, !#$^&*?[(){}<>~;'"`|=SPC, TAB, NEWLINE 및 비트 8이 설정된 일부 바이트는 (적어도 일부 컨텍스트에서는) 특별하거나 특별할 수 있습니다.

특별한 의미를 제거하여 문자 그대로 처리하려면 따옴표를 사용할 수 있습니다.

사용:

  • '...'각 문자의 특별한 의미를 제거합니다.

    printf '%s\n' '\/\/ Those $quoted$ strings are passed literally as
    single arguments (without the enclosing quotes) to `printf`'
    
  • \문자의 특별한 의미만 제거합니다.

    printf '<%s>\n' foo bar\ baz #comment
    

    위에서는 a 앞의 공백 문자만 \문자 그대로 전달됩니다 printf. 다른 것들은 셸에서 토큰 구분 기호로 처리됩니다.

  • 매개변수 확장( , , ...), 산술 확장( 일부 쉘 에서도 )을 "..."허용하면서 문자를 인용하는 데 사용됩니다 .$var$#${foo#bar}$((1+1))$[1+1]명령 대체( $(...)또는 이전 형식입니다 `...`. 실제로 대부분의 경우어쨌든 나는 이 확장을 큰따옴표 안에 넣고 싶습니다.. \inside를 사용하면 "..."여전히 특별하지만 해당 문자만 해당 문자의 특별한 의미를 제거할 수 있습니다.

  • 문자열에 문자가 포함된 경우 나머지 문자를 '계속 사용할 수 있으며 or 또는 (사용 가능한 경우) 처럼 인용할 수 있는 다른 인용 메커니즘을 사용할 수 있습니다 .'...''"'"\'$'\''

    echo 'This is "tricky", isn'\''t it?'
    
  • 현대적인 $(...)형태의 명령 대체를 사용하십시오. 이전 버전은 `...`Bourne 쉘과의 호환성을 위해서만 사용됩니다. 즉, 매우 오래된 시스템의 경우, 사용되지 않는 경우 변수 할당에만 사용됩니다.

    echo "`echo "foo bar"`"
    

    Bourne 쉘이나 ksh의 AT&T 버전에서는 작동하지 않습니다. 또는:

    echo "`echo \"foo bar\"`"
    

    이는 Bourne 및 AT&T ksh에서는 작동하지만 yash(2020년 편집자:2.41 이하 버전에서만,2.42에서 변경되었습니다./오류 보고서/범죄), 그러나 다음을 사용하십시오.

    var=`echo "foo bar"`; echo "$var"
    

    이것은 모든 사람에게 적용됩니다.

    또한 큰따옴표를 사용하여 이식 가능하게 중첩할 수 없으므로 변수가 다시 사용됩니다. 또한 특수 백슬래시 처리에 유의하세요.

    var=`printf '%s\n' '\\'`
    

    $var백슬래시 내부에 추가 백슬래시 처리 계층이 있으므로( \, ` 및 $( "인용된 경우 제외 )) 백슬래시를 내부적으로만 저장하므로 yash다음이 필요합니다.

    var=`printf '%s\n' '\\\\'`
    

    또는

    var=`printf '%s\n' '\\\'
    

    대신에.

Ces 가족

csh와 tcsh는 구문이 크게 다르지만 공유 유산으로 인해 Bourne 쉘과 여전히 많은 공통점을 가지고 있습니다.

특수 문자:

  • "'&|;()^`<>$, 공백, 줄 바꿈 및 탭은 따옴표가 없는 모든 곳에서 특별합니다.
  • #(csh는 주석 리더로 소개된 쉘입니다 #)는 스크립트 시작 부분이나 인용되지 않은 공백, 탭 또는 개행 문자 뒤에 특별합니다.
  • *?[와일드카드로 특별하므로 목록 컨텍스트에서
  • {anything}독립적인 특별한 경우를 제외하고는 특별합니다 {}(csh는 중괄호 확장을 도입하는 쉘입니다).
  • !^역사적 확장(csh의 발명이기도 함)의 일부로 특별하며 인용 규칙도 특별합니다 .
  • ~(물결표 확장도 csh 발명품입니다.) 어떤 경우에는 특별합니다.
  • bash, zsh 및 yash와 마찬가지로 %명령 위치는 작업 운영에 사용됩니다(csh의 또 다른 발명품).

참조 연산자

Bourne 쉘과 동일하지만 동작이 다릅니다. 구문 관점에서 볼 때 tcsh는 csh처럼 작동하며 많은 csh 버전에 심각한 버그가 있음을 알 수 있습니다. 대략적으로 작동하는 csh 버전을 얻으려면 최신 버전의 tcsh를 구하십시오.

  • \줄 바꿈을 제외한 단일 문자를 이스케이프합니다(Bourne 쉘과 동일). 이스케이프할 수 있는 유일한 참조 연산자입니다 !. \<newline>이스케이프하지는 않지만 명령 구분 기호에서 토큰 구분 기호(예: 공백)로 변환합니다.
  • "..."$자신, , `개행 문자 및 를 제외한 모든 문자를 이스케이프합니다 !. Bourne 쉘과 달리 \escape $`inside 는 사용할 수 없지만 escape 또는 newline은 "..."사용할 수 있습니다 (단, a 또는 newline이 앞에 오지 않는 한 자체는 사용할 수 없음). 말 은 , 말 은 .\!!!"\!"\!"\\!"
  • '...'!자신과 개행 문자를 제외한 모든 문자를 이스케이프합니다 . 큰따옴표와 마찬가지로 !개행 문자도 백슬래시로 이스케이프할 수 있습니다.
  • 명령 대체는 구문을 통해서만 가능하며 `...`안정적으로 사용하기 어렵습니다.
  • 변수 대체 역시 설계가 매우 잘못되어 오류가 발생하기 쉽습니다. 연산자는 $var:q변수와 관련된 보다 안정적인 코드를 작성하는 데 도움이 됩니다.

일반화하다

가능하다면 csh를 멀리하세요. 사용할 수 없는 경우:

  • 작은따옴표는 대부분의 문자를 인용합니다. !개행 문자가 여전히 필요합니다 \.
  • \대부분의 문자를 벗어날 수 있습니다
  • "..."$var:q일부 확장을 허용하는 것이 가능하지만 개행 및/또는 백슬래시 문자가 포함된 경우에는 문제가 발생하므로 작은 따옴표를 사용하고 변수 확장을 수행하는 것이 더 좋습니다 . 배열의 요소를 안정적으로 연결하려면 루프를 사용해야 합니다.

rc가족

rcplan9껍질 이에요 . plan9 코드는 이제 FLOSS로 출시되었으며 해당 사용자 공간 소프트웨어는 rcLinux로 포팅되었습니다. Byron Rakitzis는 또한 1990년대 초에 Unix용 복제본을 작성했으며 rc, 여기에서 esakanga.

이전 버전과의 호환성을 위해 Bourne과 같은 쉘을 사용하지 않았다면 모든 사람이 사용할 더 깨끗하고 더 나은 구문을 갖춘 쉘입니다.

rc/akanga

특수 문자

  • #;&|^$=`'{}()<>, SPC, TAB 및 NEWLINE은 인용되지 않은 경우 항상 특별합니다.
  • *?[와일드카드 연산자입니다.

참조 연산자

'...'유일한 참조 연산자입니다. 텍스트는 다음과 같이 '작은따옴표로 묶입니다 ''.

echo 'it''s so simple isn''t it?'

es

es로 볼 수 있다실험적인쉘은 rc.

그러나 약간의 차이점이 있습니다. 이 Q&A에서 흥미로운 점은 이것이 \인용 연산자(줄 바꿈을 제외한 모든 특수 문자를 인용)이기도 하며 \n줄 바꿈, \b백슬래시와 같은 이스케이프 시퀀스를 도입하는 데에도 사용할 수 있다는 것입니다.

물고기

Fish는 주로 대화형 사용을 위해 고안된 상대적으로 새로운 제품(2005년경)이며 다른 쉘과 상당히 다른 구문을 가지고 있습니다.

특수 문자

  • "'\()$%{}^<>;&|인용되지 않은 경우 항상 특별합니다 %(PID 확장의 경우)는 다른 쉘과 크게 다르며 `특별하지 않습니다.
  • #(주석) 인용되지 않은 공백, 탭, 줄 바꿈 또는;&|^<>
  • *?(그러나 아님 [...]) 와일드카드 연산자

참조 연산자

  • \개행 문자 이외의 단일 특수 문자를 인용하지만 C 이스케이프 시퀀스( \n, \b...) 리더로도 사용됩니다. IOW, \n인용문이 아니라 n개행 문자입니다.
  • "..."자신을 제외한 모든 것을 인용 $하고 백슬래시와 백슬래시를 사용하여 이스케이프할 수 있습니다. \<newline>내부 연속 라인(삭제됨)입니다 "...".
  • '...'자신과 를 제외한 모든 항목을 인용하며 \백슬래시를 사용하여 이스케이프할 수 있습니다.

답변2

1. 탈출

다음과 같이 모든 문자를 이스케이프하려면 a를 사용하십시오 \(개행/캐리지 리턴 문자에는 작동하지 않음).

$ echo Use a \"\\\" symbol to escape characters.
Use a "\" symbol to escape characters.

2.큰따옴표

다음과 같이 전체 텍스트를 "s로 묶습니다.

$ var=variables;echo "Enclose text in \"s. You can also use $var in them. `echo Surprise!!!`"
Enclose text in "s. You can also use variables in them. Surprise!!!

3. 작은따옴표

큰따옴표와 동일하지만 특별한 표시가 없습니다.

$ proof=proveit;echo 'This should not read "proveit": $proof'
This should not read "proveit": $proof

관련 정보