Linux
找不到命令:xsel -ob
我正在使用 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" }
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:].-]/_}