다음과 같이 실행되는 함수를 만들고 싶습니다.
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
이 이것이 갈 길입니다. 함수를 있는 그대로 정의한 다음 alias
include를 사용할 수 있습니다 noglob
.
downloadyoutube(){
youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best' "$1"
}
alias downloadyoutube="noglob downloadyoutube"
어쨌든, 이러한 주장으로 무엇을 하려고 하는지는 의미가 없습니다. youtube-dl
현재 페이지를 읽는 데 수년이 걸렸다는 점에 암묵적으로 동의하십시오 man
.
나는 Kusarananda가 옳았다는 점을 강조하고 싶습니다.
- 일부 특수 문자가 문제가 되기를 원하는 경우를 대비해 여기에 있을
'
필요도 없습니다 ."
- 와일드카드를 꺼도 이벤트/리디렉션 문자를 방지하는 데 도움이 되지 않습니다. 모든 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에서 예기치 않게 발생할 수 있는 중괄호 확장( {...}
) 또는 하위 셸( )이 비활성화되지 않습니다.(...)