我正在使用 Manjaro Linux。我更改了 yt-dlp 的 zsh 配置现在我明白了
❯ ytvp
deal_with_long_filename:1: command not found: xsel -ob
deal_with_long_filename:2: command not found: xsel -ob
日志显示
Usage: yt-dlp [OPTIONS] URL [URL...]
yt-dlp: error: no such option: --continue
--no-overwrites
--no-post-overwrites
--verbose
--restrict-filenames
--retry-sleep fragment:exp
Usage: yt-dlp [OPTIONS] URL [URL...]
yt-dlp: error: no such option: --continue
--no-overwrites
--no-post-overwrites
--verbose
--restrict-filenames
--retry-sleep fragment:exp
为什么它将所有选项视为一个选项?
我尝试过xsel -ob
单独运行该命令,效果很好。
我该如何解决?
我想保留&
我正在使用的发送到后台选项。函数的定义会出现问题吗deal_with_long_filename
?
这是我现在的配置
opts="--continue
--no-overwrites
--no-post-overwrites
--verbose
--restrict-filenames
--retry-sleep fragment:exp=2:64
--print-to-file"
if [ -f /usr/local/bin/youtube-dl ]; then
yt_dlp="/usr/local/bin/yt-dlp"
else
yt_dlp="$(which yt-dlp)"
fi
# If using Mac
if [[ "$(uname -a | awk '{print $1}')" == "Darwin" ]]; then
paste="pbpaste"
opts="${opts} --ffmpeg-location /usr/local/bin/ffmpeg"
else # If using Linux
paste="xsel -ob"
fi
sanitize_linux_filename() {
echo "$1" | sed -e 's/[^a-zA-Z0-9._-]/_/g'
}
get_log_name() {
TIMESTAMP=$( date +%y%m%d%H%M%S )
NAME=$( sanitize_linux_filename "$1" )
echo "yt-dlp_${TIMESTAMP}_${NAME}.log"
}
deal_with_long_filename() {
if ! $yt_dlp $opts --output "%(upload_date>%Y-%m-%d|)s%(upload_date& |)s%(title)s-%(id)s.%(ext)s" "$($paste)" >> "/tmp/$LOG_NAME" 2>&1; then
$yt_dlp $opts --output "%(upload_date>%Y-%m-%d|)s%(upload_date& |)%(webpage_url_domain)s-%(id)s.%(ext)s" "$($paste)" >> "/tmp/$LOG_NAME" 2>&1
fi
}
# Video Playlist
ytvp() {
LOG_NAME=$( get_log_name "$1" )
opts="${opts}
--format '(bv+(wa[abr>=64]/ba))/b'
--format-sort res:720,tbr~2000
--no-playlist
--download-archive 'downloaded.txt'"
deal_with_long_filename "$1" "$LOG_NAME"
}
答案1
xsel -ob
错误消息是正确的,您的系统上没有调用任何命令。您尝试使用的命令是xsel
及其-ob
选项。由于您将命令放入字符串中,因此它被视为单个实体。
该问题与中描述的问题类似我们如何运行存储在变量中的命令?
一定要以可用作单独字符串的方式存储有序字符串的集合,请使用数组。
opts=(
--continue
--no-overwrites
--no-post-overwrites
--verbose
--restrict-filenames
--retry-sleep fragment:exp=2:64
--print-to-file
)
添加到数组:
opts+=( --ffmpeg-location /usr/local/bin/ffmpeg )
# ...
opts+=(
--format '(bv+(wa[abr>=64]/ba))/b'
--format-sort res:720,tbr~200
--no-playlist
--download-archive 'downloaded.txt'
)
然后,在zsh
shell 中将其用作$opts
.
您的变量也有同样的问题paste
,它也应该是一个数组,因为您可能希望将其视为两个字符串xsel
和-ob
:
paste=( xsel -ob )
脚本中还有许多其他不必要的复杂内容,例如用于uname
获取操作系统类型:
if [[ $OSTYPE == darwin* ]]; then ...; fi
...或用于sed
从字符串中删除某些字符:
NAME=${1//[^[:alnum:].-]/_}