명령을 찾을 수 없음: 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

왜 모든 옵션을 하나로 취급합니까?

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.

변수와 동일한 문제가 있습니다 . 아마도 두 문자열 paste의 합으로 처리하고 싶기 때문에 배열이어야 합니다 xsel.-ob

paste=( xsel -ob )

uname스크립트에는 운영 체제 유형을 가져오는 등 불필요한 복잡성이 많이 있습니다 .

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

...또는 sed문자열에서 특정 문자를 제거하려면:

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

관련 정보