コマンドが見つかりません:xsel -ob

コマンドが見つかりません: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

なぜすべてのオプションを1つとして扱うのですか?

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シェルから$opts

変数と同じ問題があります。おそらく2つの文字列pasteの合計として扱いたいので、配列でなければなりませんxsel-ob

paste=( xsel -ob )

unameスクリプトには、オペレーティングシステムの種類を取得するなど、不必要な複雑さがたくさんあります。

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

...またはsed文字列から特定の文字を削除するには:

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

関連情報