首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在.zshrc中修改youtube-dl的问题

在.zshrc中修改youtube-dl的问题
EN

Stack Overflow用户
提问于 2017-03-14 19:02:06
回答 2查看 230关注 0票数 1

我的.zshrc中的代码是:

代码语言:javascript
运行
复制
ytdcd () {  #youtube-dl that automatically puts stuff in a specific folder and returns to the former working directory after.
    cd ~/youtube/new/ && {
        youtube-dl "$@"
        cd - > /dev/null
    }
}
ytd() { #sofar, this function can only take one page. so, i can only send one youttube video code per line. will modify it to accept multiple lines..
    for i in $*;
        do
        params=" $params https://youtu.be/$i"
    done

    ytdcd -f 18 $params
}

因此,在命令行(终端)上,当我输入ytd DFreHo3UCD0时,我希望在https://youtu.be/DFreHo3UCD0下载视频。问题是,当我连续输入命令时,系统只是尝试下载前一个命令的视频,并正确地声称下载已经完成。

例如,输入:

代码语言:javascript
运行
复制
> ytd  DFreHo3UCD0
> ytd  L3my9luehfU

不会尝试下载L3my9luehfU的视频,而是只下载两次DFreHo3UCD0的视频。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-14 19:32:56

我会声明paramlocal,这样您就不会在url之后添加url.

您可以尝试将此功能添加到您的.zshrc中。

代码语言:javascript
运行
复制
funfun() {
        local _fun1="$_fun1 fun1!"
        _fun2="$_fun2 fun2!"

        echo "1 says: $_fun1"
        echo "2 says: $_fun2"
}

观察事物;)

编辑(解释):

在获取shell脚本时,可以将它添加到当前环境中,这就是可以运行定义的函数的原因。因此,当这些函数使用变量时,默认情况下,这些变量将是全局的,并且可以从您的环境中的任何地方访问!因此,在这种情况下,param是为您的shell会话的所有长度全局定义的。由于您希望同时允许下载多个视频,因此将值附加到这个全局变量中,这个变量将一直增长。

强制local告诉zshparams的范围限制在函数上。

另一种解决方案是在调用函数时重置变量。

票数 1
EN

Stack Overflow用户

发布于 2017-03-14 21:28:18

首先-没有必要返回到ytdcd的旧目录:您可以只在子there内切换到一个新目录,然后exec youtube-dl将该子there替换为应用程序进程:

这有更少的事情要出错:中止函数的执行不能将内容留在错误的目录中,因为父shell (您正在交互使用的shell)一开始从未更改过目录。

代码语言:javascript
运行
复制
ytdcd () {
    (cd ~/youtube/new/ && exec youtube-dl "$@")
}

第二,在构建参数列表时使用数组,而不是字符串。

如果使用set -x记录其执行情况,您将看到原始命令运行如下所示:

代码语言:javascript
运行
复制
ytdcd -f 18 'https://youtu.be/one https://youtu.be/two https://youtu.be/three'

看到那些引文了吗?这是因为$params是一个字符串,作为单个参数传递,而不是数组。(在bash -或遵循POSIX规则的另一个shell中-未引用的字符串展开将是字符串拆分和全局扩展,但zsh不遵循POSIX规则)。

下面构建一个单独的参数数组并单独传递它们:

代码语言:javascript
运行
复制
ytd() {
    local -a params=( )
    local i

    for i; do
        params+=( "https://youtu.be/$i" )
    done

    ytdcd -f 18 "${params[@]}"
}

最后,您实际上并不打算将所有的URL传递给一个youtube-dl实例。若要在每个URL中运行单独的实例,请使用:

代码语言:javascript
运行
复制
ytd() {
    local i retval=0
    for i; do
        ytdcd -f 18 "$i" || retval=$?
    done
    return "$retval"
}

请注意,我们正在捕获不成功的退出状态,以便不隐藏除最后一个(否则会发生的)以外的任何ytdcd实例中的错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42794437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档