이 문제를 여러 가지 방법으로 해결할 수 있다는 것을 알고 있지만 bash 내장 기능 만 사용하여 수행 할 수있는 방법이 있는지, 그렇지 않은 경우 가장 효율적인 방법이 무엇인지 궁금합니다.
다음과 같은 내용의 파일이 있습니다.
AAA
B C DDD
FOO BAR
즉, 여러 줄이 있고 각 줄에는 공백이 있거나 없을 수 있습니다. 다음과 같은 명령을 실행하고 싶습니다.
cmd AAA "B C DDD" "FOO BAR"
내가 사용 cmd $(< file)
하면 얻을
cmd AAA B C DDD FOO BAR
그리고 내가 사용 cmd "$(< file)"
하면
cmd "AAA B C DDD FOO BAR"
각 라인이 정확히 하나의 매개 변수로 처리되도록하려면 어떻게해야합니까?
이 작업을 수행하는 표준 방법 bash
은 다음과 같습니다.
unset args
while IFS= read -r line; do
args+=("$line")
done < file
cmd "${args[@]}"
또는 bash 버전에 다음이있는 경우 mapfile
:
mapfile -t args < filename
cmd "${args[@]}"
mapfile과 while-read 루프와 one-liner 사이에서 찾을 수있는 유일한 차이점
(set -f; IFS=$'\n'; cmd $(<file))
전자는 빈 줄을 빈 인수로 변환하는 반면 한 줄은 빈 줄을 무시합니다. 이 경우 한 줄짜리 행동은 어쨌든 내가 선호하는 것이므로 두 배의 보너스는 컴팩트합니다.
나는 사용할 IFS=$'\n' cmd $(<file)
것이지만 작동하지 않습니다. 왜냐하면 효력이 발생 $(<file)
하기 전에 명령 줄을 형성하도록 해석 되기 때문 입니다 IFS=$'\n'
.
제 경우에는 작동하지 않지만 이제는 많은 도구 가 이러한 상황의 일반적인 원인 인 파일 이름을 처리 할 때 줄을 끝내는 것을 지원하는 null (\000)
대신 newline (\n)
에 이러한 상황의 일반적인 원인 인 파일 이름을 처리 할 때이 작업을 훨씬 쉽게 지원한다는 것을 배웠습니다. :
find / -name '*.config' -print0 | xargs -0 md5
globbing, interpolating 등의 작업없이 완전한 파일 이름 목록을 md5에 대한 인수로 제공합니다. 비 내장 솔루션으로 이어집니다.
tr "\n" "\000" <file | xargs -0 cmd
이것 역시 공백 만있는 줄을 캡처하지만 빈 줄을 무시합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다