Linux

找不到命令:xsel -ob

  • October 21, 2022

我正在使用 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'
)

然後,在zshshell 中,將其用作$opts.

您的paste變數也有同樣的問題,它也應該是一個數組,因為您可能希望將其視為兩個字元串xsel-ob

paste=( xsel -ob )

您的腳本中還有許多其他不必要的複雜內容,例如uname用於獲取作業系統類型:

if [[ $OSTYPE == darwin* ]]; then ...; fi

…或sed用於從字元串中刪除某些字元:

NAME=${1//[^[:alnum:].-]/_}

引用自:https://unix.stackexchange.com/questions/721873