쉘의 "quote"명령


15

명령 사용법은 무엇입니까 quote? /bin폴더에 대한 실행 파일이 아니며 Bash 내장 파일에서 찾을 수 없습니다. echo명령과 같은 첫 번째 매개 변수 만 인쇄하고 더 이상 아무것도 인쇄 하지 않는 것 같습니다.


그냥 따옴표를 추가
하킴 와하 브에게

1
방금 훑어 보았을 때 따옴표와 비슷한 shell-quote라는 유틸리티를 찾았지만 ssh와 같은 것들과 bash 스크립트 디버깅에 사용됩니다. 여기에 각주로 포함시킬 것이라고 생각했습니다. ' linux.die.net/man/1/shell-quote '

WTF가 quote그런 모호한 목적으로 사용되는 공통 단어를 가지고 있다고 생각합니다. "내부"로 표시하기위한 접두어 없음, 문서 없음, 아무것도 아님, 배포판의 고급 완성 메커니즘에 대한 구현 세부 사항을 파고 가지 않는 한. 나는 이것을 조금 혼란스럽게 생각한다.
하이드

모국어가 영어가 아닌 사람에게는 더 모호해집니다. 예를 들어 나처럼 :)
whtyger

답변:


10

무엇입니까?

나는이 명령이 내 껍질 ( 물고기, 대화 형 대화 형 쉘 ) 에서 작동하지 않는 것을 알았습니다 . bash에서만 작동하는 것 같습니다 (Ubuntu의 기본값).

chocobai@pc ~> /bin/bash 
chocobai@pc:~$ quote asdf
'asdf'chocobai@pc:~$ 

chocobai@pc:~$ type quote
quote is a function.
quote ()
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

무엇을합니까? 무엇을 위해 사용할 수 있습니까?

따옴표를 추가하지만 개행은 추가하지 않습니다. 또한 bash에 적합한 방식으로 작은 따옴표를 이스케이프 처리합니다. 스크립트에서 변수 또는 다른 종류의 문자열을 인용하는 것이 유용 할 수 있습니다. 예를 들어 공백이있는 경로 / 매개 변수의 경우이가 필요합니다. 이 작업을 수행하는 다른 방법이 있지만

웹에서 문서를 찾을 수 없다는 것이 정말 이상합니다. 그러나 그것이 무엇을하는지는 쉽게 알 수 있습니다.


2
which대화식 쉘과 스크립트 모두에서 쓸모가 없습니다. type대신 사용하십시오 . type quote함수임을 알려주고 함수 정의를 보여줍니다. 내장 help type에서 더 많이 실행하십시오 type.
geirha

네 말이 맞아, 고마워 위의 대답은 유형을 사용하여 그것이 무엇인지 알았습니다. 글쎄, '어떤'덕분에 / bin / 등의 실행 파일이 아니었다는 것을 알았습니다. 경로를 반환하지 않았기 때문입니다. 나는 그것이 여전히 유용하다고 생각합니다. 그러나 당신 말이 맞습니다. 유형을 추가하겠습니다.
verpfeilt

2
내 우분투 12.04 에서이 기능은 실제로 설명되어 있습니다.이 기능은 관련 섹션 이 주석 처리 된 곳이 아니라 기본적으로 /etc/bash_completion제공됩니다 . 또한 폴더 우분투 12.04에 존재하지 않는다. ~/.bashrc/etc/bash.bashrc/etc/bash_completion/usr/share/bash-completion/
whtyger

8

quote파일에 정의 된 함수입니다 (여기서는 데비안 시스템에 있지만 우분투에서 동일하다고 생각합니다). /usr/share/bash-completion/bash_completion그 자체는 /etc/bash.bashrcBash가 시작할 때 제공됩니다 .

나는이 기능을 절대로 사용하지 않을 것이다! 쉘이 안전하게 사용할 수 있도록 따옴표를 인용해야하는 경우 다음 printf과 같이 %q수정 자 와 함께 사용하십시오 .

printf '%q\n' "Hello my friend I like 'single quotes' as well as \"double quotes\""

실제로 이것은 매우 드물게 사용되지만 사용자가 일반적으로하는 것처럼 상위 수준의 물건에 대한 더 나은 전략이 항상 있습니다. 이것은 quote우리가 알고 싶지 않은 모호한 것들에 의해 내부적으로 사용됩니다. 이 quote기능은 공급 업체 / 배포 별 (데비안 전용)이며 아마도 이식성이 없으며 향후 릴리스에서 변경 될 수도 있습니다.

편집하다. 방금 Ubuntu 12.04 시스템을 확인했으며 quote함수는에 /etc/bash_completion의해 정의되고 /etc/bash.bashrc자체적으로에 의해 제공됩니다 /etc/profile.

이것을 어떻게 결정 했습니까? 약간의 휴리스틱 사용 :

  • 있는지 확인 quote에 나타납니다 /etc/profile:

    grep '\bquote\b' /etc/profile

    아니요. 다음 단계로 가십시오.

  • 무엇에 의해 소스 파일이 /etc/profile있습니까?

    grep '[[:space:]]\.[[:space:]]' /etc/profile

    나는 $i(이 소스에 대해 소스를 조사해야하지만,이 경우 파일 /etc/profile.d/*.sh이 있고 읽을 수있는 경우) 파일 /etc/bash.bashrc입니다 /etc/bash.bashrc.

  • 인가 quote/etc/bash.bashrc? 예 / 아니요 등

quote실제로 작은 따옴표를 이스케이프하므로 셸에서 사용할 수 있습니다. printf %q이 사용 사례 와 마찬가지로 잘 작동합니다 .
Flimm

@Flimm은 귀하의 책임하에 사용하십시오!
gniourf_gniourf

@gniourf_gniourf printf % q 가 물결표 ( ~ )를 제대로 처리하지 못한다고 생각 합니다. 이것을 시도하십시오 : my_str='~/.bashrc'; echo ' Expected:' "$my_str"; bash -c "echo ' quote:' $(quote "$my_str")"; bash -c "echo 'printf %q:' $(printf '%q\n' "$my_str")". 당신은 같은 것을 볼 것이다 Expected: ~/.bashrc, quote: ~/.bashrc하고 printf %q: /home/your_username/.bashrc.
Rockallite

1
@ Rockallite : 난 그냥 시도하고 예상대로 작동합니다 ...
gniourf_gniourf

소스로 바로 건너 뛰려면을 사용 (shopt -s extdebug; declare -F quote)하여 함수 이름, 줄 번호 및 파일 이름을 알 수 있습니다.
wjandrea

3

quote 함수입니다 :

quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

이 함수는 bash 초기화 파일 어딘가에 정의되어 있습니다. 보다 정확하게는 Ubuntu 13.04를 사용하는 경우 /usr/share/bash-completion/bash_completion142 행에서 찾을 수 있습니다 .

다음 명령을 사용하여 확인하십시오.

type quote

그 목적은 분명하다.


그것이 하는 일은 분명하지만 왜 그렇게하고 싶을 수도 있습니다. 의심의 여지를 피하기 위해 : $INPUT공백, 따옴표 또는 다른 문자를 포함 할 수 있는 변수를 가져 와서 bash에서 단일 인수로만 취급하는 문자열을 반환하는 데 사용됩니다.
Ben XO
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.