다음과 같은 텍스트 파일에 URL 목록을 설치했습니다 myurls
.
http://www.examples.com/1
http://www.examples.com/2
http://www.examples.com/3
wkhtmltopdf
이러한 URL을 입력으로 전달하려면 어떻게 해야 합니까 ?
파일을 사용하지 않고 URL을 저장하는 간단한 방법은 다음과 같습니다.
wkhtmltopdf http://www.examples.com/1 http://www.examples.com/2 http://www.examples.com/3 all.pdf
아마도 wkhtmltopdf
인수에 대한 특별한 요구 사항이 있을 수 있지만 제 질문은 다음보다 나을 것 같습니다 wkhtmltopdf
. 파일에 저장된 (개행으로 구분된) 문자열 목록을 명령의 인수 목록으로 제공하는 방법은 무엇입니까?
답변1
노력하다:
# disable shell filename generation (globbing)
# and temporarily save applicable shell state
set -f -- "-${-:--}" "${IFS+IFS=\$2;}" "$IFS" "$@"
# explicitly set the shell's Internal
# Field Separator to only a newline
eval "IFS='$(printf \\n\')"
# split command substitution into an
# arg array at $IFS boundaries while
# eliding all blank lines in myurls
wkhtmltopdf $(cat <myurls) allurl.pdf
# restore current shell to precmd state
unset IFS; set +f "$@"; eval "$1 shift 2"
일반적으로 적용되는 속성을 변경한 후 모든 셸 상태를 복원할 때는 주의하세요. 하지만 기본 원칙은 쉘의 분리대를 $IFS
안에 넣어두는 것 뿐입니다.아니요명령 대체의 확장에 가 포함된 경우 [?*
glob으로 확장된 다음 따옴표 없이 인수 목록으로 확장됩니다.
부작용을 겪을 필요가 없으므로 서브셸에서 더 간단하고 강력하게 수행할 수 있습니다.
( set -f; IFS='
'; wkhtmltopdf $(cat) allurl.pdf
) <myurls
답변2
불행하게도 이것은 사실이 아니지만 wkhtmltopdf
많은 명령은 파일에서 매개변수를 읽는 옵션을 제공합니다( wget -i
예를 들어) 이것은 가능할 때마다 선호되는 방법입니다.
파일의 공백이 중요하지 않은 경우 명령 대체가 작동합니다.
wkhtmltopdf $(cat myurls) all.pdf
을 사용하면 xargs
예제에서도 작동하지만 일반적으로 수행하려는 작업이 주어지면 마지막 실행의 페이지만 wkhtmltopdf
한 번만 실행되는지 확인해야 합니다 .all.pdf
wkhtmltopdf
xargs -a myurls sh -c 'wkhtmltopdf "$@" all.pdf'
wkhtmltopdf
표준 입력에서 매개변수를 읽는 옵션을 지원합니다., --read-args-from-stdin
. 이것을 사용하여 줄 바꿈으로 구분된 URL을 제공하는 경우 반복됩니다. 이를 방지하려면 표준 입력이 모든 URL이 공백으로 구분된 한 줄인지 확인해야 합니다.
tr "\n" " " < myurls | wkhtmltopdf --read-args-from-stdin all.pdf
답변3
그리고 xargs
:
xargs -a myurls sh -c 'wkhtmltopdf $@ all.pdf'
답변4
또 다른 방법:
wkhtmltopdf $(printf '%s ' $(<myurls)) all.pdf