이 작업을 수행하는 정식 방법 bash
은 다음과 같습니다.
unset args
while IFS= read -r line; do
args+=("$line")
done < file
cmd "${args[@]}"
또는 bash 버전에 다음이있는 경우 mapfile
:
mapfile -t args < filename
cmd "${args[@]}"
맵 파일과 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 또는 보간 또는 기타 사항없이 md5에 인수로 제공합니다. 내장되지 않은 솔루션으로 연결됩니다.
tr "\n" "\000" <file | xargs -0 cmd
공백도있는 행은 캡처하지만 빈 행은 무시합니다.