Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(再次)什么';youtube dl自动下载bash脚本有什么问题_Bash_Youtube Dl - Fatal编程技术网

(再次)什么';youtube dl自动下载bash脚本有什么问题

(再次)什么';youtube dl自动下载bash脚本有什么问题,bash,youtube-dl,Bash,Youtube Dl,前一段时间,我问我正在尝试的bash脚本有什么问题,我得到了一个很好的解决方案: 我不断修改脚本以使用不同的youtube dl命令组合,并处理我的非常不稳定的互联网连接(这就是while/do循环的原因),它一直工作正常,但当我尝试使用相同的脚本结构从列表中的特定项目(例如:项目编号15)开始下载Youtube播放列表时,我遇到了一个错误。我仍然是bash脚本的新手(显然),所以我不知道出了什么问题 所讨论的脚本如下: #!/bin/bash function video { youtube

前一段时间,我问我正在尝试的bash脚本有什么问题,我得到了一个很好的解决方案:

我不断修改脚本以使用不同的youtube dl命令组合,并处理我的非常不稳定的互联网连接(这就是while/do循环的原因),它一直工作正常,但当我尝试使用相同的脚本结构从列表中的特定项目(例如:项目编号15)开始下载Youtube播放列表时,我遇到了一个错误。我仍然是bash脚本的新手(显然),所以我不知道出了什么问题

所讨论的脚本如下:

#!/bin/bash

function video {
youtube-dl --no-warnings -o '%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s' --socket-timeout 15 --hls-use-mpegts -R 64 --fragment-retries 64 --prefer-free-formats --all-subs --embed-subs -f 'bestvideo[height<=720]+bestaudio/best[height<=720]' "$@"
}

read -p "url: " url
video "$url"
while [ $? -ne 0 ]; do sleep 5 && video "$url" ; done
clear && echo completed!
#/bin/bash
功能视频{

youtube dl--无警告-o%%(播放列表)s/%(播放列表索引)s-%(标题)s.%(ext)s'--套接字超时15--hls使用mpegts-R 64--片段重试64--首选自由格式--所有子项--嵌入子项-f'最佳视频[高度在bash中,命令开头的字符“-”用于设置选项,如果要打印
--播放列表…
则应使用转义字符“\”

尝试类似于
printf“\-\-播放列表…”的内容。

更正:printf“%s”-播放列表…“

已解决! 我的兄弟(一名“退休”程序员)花了一些时间来评估Bash脚本的工作原理,我们找到了一种使脚本工作更简单的方法,只需添加youtube dl命令和youtube URL作为参数

脚本有点变化,现在看起来是这样的:

#!/bin/bash

function video() {
youtube-dl --no-warnings -o '%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s' --socket-timeout 15 --hls-use-mpegts -R 64 --fragment-retries 64 --prefer-free-formats --all-subs --embed-subs -f 'bestvideo[height<=720]+bestaudio/best[height<=720]' "$@"
}

video $@
while [ $? -ne 0 ]; do sleep 5 && video $@ ; done
clear && echo completed!
!/bin/bash
函数视频(){

youtube dl--无警告-o%%(播放列表)s/%(播放列表索引)s-%(标题)s.%(ext)s'--套接字超时15--hls使用mpegts-R 64--片段重试64--首选自由格式--所有子项--嵌入子项-f'最佳视频[高度更好的设计是接受任何选项和URL作为命令行参数。需要交互式I/O的脚本很难包含在更大的脚本中,而且通常更难使用(您失去了使用shell的制表符完成和命令行历史记录等功能)

!/bin/bash
#不要不必要地使用Bash-only语法来声明函数
#缩进代码
视频(){
youtube dl--没有警告\
-o“%(播放列表)s/%(播放列表索引)s-%(标题)s.%(分机)s”\
--套接字超时15--hls使用mpegts-R 64--片段重试64\
--更喜欢自由格式——所有子类——嵌入子类\

-f'bestvideo[Heights
--playlist start=15
应该是脚本的一个选项,而不是
printf
或要在脚本的标准输入上打印的内容。其语法是
printf“$url”| list720--playlist start=15
|
之前的内容是一个独立的命令,您的脚本不知道。我尝试了您的建议,但仍然不起作用…例如:
printfhttps://www.youtube.com/playlist?list=PLS1QulWo1RIYmaxcEqw5JhK3b-6rgdWO_124; list720——playlist start=15
您不想使用URL作为
printf
格式字符串。此外,URL包含一些由shell解释的字符。请尝试
printf“%s”https://...gdW0_“
。也就是说,将URL作为指定的
%s
转换的参数,并将其放在单引号中。如果它包含单引号,则可以用
\'
(引用反斜杠引号)。正确的解决方案是
printf“%s”-playlist'
。如果OP坚持使用
printf
(并学会引用字符串),那么OP通常应该使用格式sting作为第一个参数。很抱歉,@gcadiou的建议无效:
printf\-\-playlist start=15https://www.youtube.com/playlist?list=PLS1QulWo1RIYmaxcEqw5JhK3b-6rgdWO|list720
此外,我可能不理解@tripleee的建议,但这也不起作用:
printf'https://www.youtube.com/playlist?list=PLS1QulWo1RIYmaxcEqw5JhK3b-6rgdWO_'--playlist start=15'| list720
printf
的第一个参数是一个格式字符串。要打印带破折号的字符串,
printf“%s”--string with dash'
如果您也要打印其他字符串,请将它们添加到格式字符串之后(格式字符串将重复,直到所有参数都用尽)。正如我在对问题的原始评论中所解释的,您实际上仍然不需要或不想这样做。两个建议:双引号引用
$@
,因为有时它会对未引号引用的变量/参数引用做一些奇怪的事情。此外,您可以将循环简化为
,直到视频“$@”;do sleep 5;done
。哦,我建议你指出一些常见的错误,比如缺少双引号。谢谢你,@gordon……现在,我还有一个问题(如果这个问题太“新手”……我甚至不知道如何用正确的语言解释自己):在你的简化循环建议中,Bash是如何“知道”的我想在“do sleep 5”之后重新调用视频“$@”部分?这就是
till
循环(以及非常类似的
while
循环)的工作方式。它运行
till
do
之间的位,如果失败,则执行
do
done
之间的部分,然后重试(从
开始直到
)直到它成功。(一个
while
循环有相反的测试:它在测试部分成功时一直运行,即直到失败。)可能让你困惑的是,测试部分不仅仅是一个被动测试,它是一个实际的活动(事实上,它是你关心的活动);但是所有的测试实际上都是活动,这个比大多数都要活跃一点。是的,我想我理解了…我想!…如果我理解正确,我使用的是“while[$?-ne 0]”像“until”一样,当我使用“until”时,我不需要添加“[$?-ne 0]”,因为在这种情况下,“until”循环就是这样做的(或多或少)…无论如何,谢谢你的建议。我添加了双引号,并替换了
list720 --playlist-start=15 'https://www.youtube.com/playlist?list=PLS1QulWo1RIYmaxcEqw5JhK3b-6rgdWO_'
bash$ printf 'http://example.com/%7Efnord'
http://example.com/0.000000E+00fnord
bash$ printf '%s\n' 'http://example.com/%7Efnord'
http://example.com/%7Efnord
list720 <<<'http://example.com/%7Efnord'