我的.zshrc中的代码是:
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下载视频。问题是,当我连续输入命令时,系统只是尝试下载前一个命令的视频,并正确地声称下载已经完成。
例如,输入:
> ytd DFreHo3UCD0
> ytd L3my9luehfU
不会尝试下载L3my9luehfU的视频,而是只下载两次DFreHo3UCD0的视频。
发布于 2017-03-14 19:32:56
我会声明param
为local
,这样您就不会在url之后添加url.
您可以尝试将此功能添加到您的.zshrc
中。
funfun() {
local _fun1="$_fun1 fun1!"
_fun2="$_fun2 fun2!"
echo "1 says: $_fun1"
echo "2 says: $_fun2"
}
观察事物;)
编辑(解释):
在获取shell脚本时,可以将它添加到当前环境中,这就是可以运行定义的函数的原因。因此,当这些函数使用变量时,默认情况下,这些变量将是全局的,并且可以从您的环境中的任何地方访问!因此,在这种情况下,param
是为您的shell会话的所有长度全局定义的。由于您希望同时允许下载多个视频,因此将值附加到这个全局变量中,这个变量将一直增长。
强制local
告诉zsh
将params
的范围限制在函数上。
另一种解决方案是在调用函数时重置变量。
发布于 2017-03-14 21:28:18
首先-没有必要返回到ytdcd
的旧目录:您可以只在子there内切换到一个新目录,然后exec
youtube-dl将该子there替换为应用程序进程:
这有更少的事情要出错:中止函数的执行不能将内容留在错误的目录中,因为父shell (您正在交互使用的shell)一开始从未更改过目录。
ytdcd () {
(cd ~/youtube/new/ && exec youtube-dl "$@")
}
第二,在构建参数列表时使用数组,而不是字符串。
如果使用set -x
记录其执行情况,您将看到原始命令运行如下所示:
ytdcd -f 18 'https://youtu.be/one https://youtu.be/two https://youtu.be/three'
看到那些引文了吗?这是因为$params
是一个字符串,作为单个参数传递,而不是数组。(在bash -或遵循POSIX规则的另一个shell中-未引用的字符串展开将是字符串拆分和全局扩展,但zsh不遵循POSIX规则)。
下面构建一个单独的参数数组并单独传递它们:
ytd() {
local -a params=( )
local i
for i; do
params+=( "https://youtu.be/$i" )
done
ytdcd -f 18 "${params[@]}"
}
最后,您实际上并不打算将所有的URL传递给一个youtube-dl
实例。若要在每个URL中运行单独的实例,请使用:
ytd() {
local i retval=0
for i; do
ytdcd -f 18 "$i" || retval=$?
done
return "$retval"
}
请注意,我们正在捕获不成功的退出状态,以便不隐藏除最后一个(否则会发生的)以外的任何ytdcd
实例中的错误。
https://stackoverflow.com/questions/42794437
复制相似问题