따옴표 없이 문자열을 입력할 수 있지만 따옴표로 해석되도록 하는 zsh 함수를 어떻게 만들 수 있나요?

따옴표 없이 문자열을 입력할 수 있지만 따옴표로 해석되도록 하는 zsh 함수를 어떻게 만들 수 있나요?

다음과 같이 실행되는 함수를 만들고 싶습니다.

youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best' "https://www.youtube.com/watch?v=_OBlgSz8sSM"

현재 .zshrc에서 나는 노력하고 있습니다.

downloadyoutube(){
    youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best' "$1"

하지만 호출할 때 URL 주위에 따옴표를 추가하기를 원합니다.

대신 달리고 싶어

downloadyoutube https://www.youtube.com/watch?v=_OBlgSz8sSM

인용없이.

설마

downloadyoutube "https://www.youtube.com/watch?v=_OBlgSz8sSM"

이를 수행할 수 있는 방법이 있습니까?

답변1

Kusalananda가 말했듯 noglob이 이것이 갈 길입니다. 함수를 있는 그대로 정의한 다음 aliasinclude를 사용할 수 있습니다 noglob.

downloadyoutube(){
  youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best' "$1"
}
alias downloadyoutube="noglob downloadyoutube"

어쨌든, 이러한 주장으로 무엇을 하려고 하는지는 의미가 없습니다. youtube-dl현재 페이지를 읽는 데 수년이 걸렸다는 점에 암묵적으로 동의하십시오 man.


나는 Kusarananda가 옳았다는 점을 강조하고 싶습니다.

  1. 일부 특수 문자가 문제가 되기를 원하는 경우를 대비해 여기에 있을 '필요도 없습니다 ."
  2. 와일드카드를 꺼도 이벤트/리디렉션 문자를 방지하는 데 도움이 되지 않습니다. 모든 YouTube URL에 해당 문자가 포함되어 있으므로 문자열(줄 끝이 아닌)에 붙여넣은 내용을 &자동으로 대체하도록 셸을 구성하는 것이 좋습니다 . zsh는 이 작업을 자동으로 수행하며 oh-my-zsh가 책임이 있다고 생각합니다.&\&

답변2

실제로 언급하지 않은 문제는 zsh파일 이름 와일드카드 패턴이 어떤 이름과도 일치하지 않으면 기본적으로 셸에서 오류가 발생한다는 것입니다.

$ downloadyoutube https://www.youtube.com/watch?v=_OBlgSz8sSM
zsh: no matches found: https://www.youtube.com/watch?v=_OBlgSz8sSM

여기의 URL에는 ?와일드카드인 문자가 포함되어 있습니다. 그러면 쉘이 URL을 패턴으로 사용하여 파일 이름 일치를 수행하라는 메시지를 표시합니다. 일치하는 항목이 없으므로 쉘이 불평하고 함수 호출을 시도하지도 않습니다.

bash쉘 옵션이 설정된 경우 failglob쉘에서 유사한 동작이 발생합니다 .

$ shopt -s failglob
$ downloadyoutube https://www.youtube.com/watch?v=_OBlgSz8sSM
bash: no match: https://www.youtube.com/watch?v=_OBlgSz8sSM

NOGLOB쉘 옵션을 설정하여 쉘이 URL을 와일드카드 패턴으로 사용하는 것을 방지할 수 있습니다 setopt NOGLOB. 를 사용할 때까지 현재 쉘 세션에서 와일드카드가 꺼집니다 unsetopt NOGLOB.

noglob개별 명령에 대한 셸 옵션을 설정하는 효과가 있는 함수 호출 앞에 접두사를 붙일 수도 있습니다 .NOGLOB

noglob downloadyoutube https://www.youtube.com/watch?v=_OBlgSz8sSM

그러나 가장 현명한 접근 방식은 함수를 호출할 때 작은따옴표를 사용하여 URL을 인용하는 것입니다. 다음을 포함할 가능성이 가장 높은 URL다른쉘 특정 문자아니요&예를 들어, 백그라운드 작업을 소개하는 와일드카드 문자입니다. &파일 이름 글로빙이 꺼진 경우에도 in이 포함된 URL은 이를 인용하지 않으면 작동하지 않습니다.

와일드카드를 꺼도 URL에서 예기치 않게 발생할 수 있는 중괄호 확장( {...}) 또는 하위 셸( )이 비활성화되지 않습니다.(...)

관련 정보