파일에 저장된 문자열을 명령의 인수 목록으로 제공하시겠습니까?

파일에 저장된 문자열을 명령의 인수 목록으로 제공하시겠습니까?

다음과 같은 텍스트 파일에 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.pdfwkhtmltopdf

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

관련 정보