[linux] 파일의 줄을 명령의 인수로 어떻게 사용합니까?

인수를 foo.txt지정 하는 파일이 있습니다.N

arg1
arg2
...
argN

내가 명령에 전달해야 my_command

파일의 줄을 명령의 인수로 어떻게 사용합니까?



답변

쉘이 bash (다른 것들 중에서)라면 바로 가기는 $(cat afile)입니다 $(< afile).

mycommand "$(< file.txt)"

‘명령 대체’섹션의 bash 매뉴얼 페이지에 설명되어 있습니다.

또는 stdin에서 명령을 읽도록하십시오. mycommand < file.txt


답변

이미 언급했듯이 백틱 또는을 사용할 수 있습니다 $(cat filename).

언급되지 않았으며 주목해야 할 것은 쉘이 공백에 따라 해당 파일의 내용을 분리하고 명령에 찾은 각 “단어”를 인수로 제공한다는 점을 기억해야한다는 것입니다. 또한 공백, 이스케이프 시퀀스 등을 포함 할 수 있도록 명령 줄 인수를 따옴표로 묶을 수는 있지만 파일을 읽더라도 동일한 작업을 수행하지는 않습니다. 예를 들어 파일에 다음이 포함 된 경우

a "b c" d

당신이 얻을 인수는 다음과 같습니다

a
"b
c"
d

각 줄을 인수로 가져 오려면 while / read / do 구문을 사용하십시오.

while read i ; do command_name $i ; done < filename


답변

command `< file`

stdin에서 명령에 파일 내용을 전달하지만 줄 바꿈을 제거하므로 각 줄을 개별적으로 반복 할 수 없습니다. 이를 위해 ‘for’루프를 사용하여 스크립트를 작성할 수 있습니다.

for line in `cat input_file`; do some_command "$line"; done

또는 (여러 줄 변형) :

for line in `cat input_file`
do
    some_command "$line"
done

또는 ( $()대신에 여러 줄 변형 ``) :

for line in $(cat input_file)
do
    some_command "$line"
done

참고 문헌 :

  1. 루프 구문 : https://www.cyberciti.biz/faq/bash-for-loop/

답변

당신은 백틱을 사용하여 그렇게합니다 :

echo World > file.txt
echo Hello `cat file.txt`


답변

가능한 모든 명령 줄 인수 (공백이있는 값, 줄 바꿈이있는 값, 리터럴 따옴표 문자가있는 값, 인쇄 할 수없는 값, glob 문자가있는 값 등)에 대해 강력한 방법 으로이 작업을 수행하려면 약간의 가치가 있습니다. 더 흥미로운.


인수 배열이 주어지면 파일에 쓰려면 다음을 수행하십시오.

printf '%s\0' "${arguments[@]}" >file

… 교체 "argument one", "argument two"적절하게, 등.


해당 파일에서 읽고 해당 내용을 사용하려면 (bash, ksh93 또는 배열이있는 다른 최신 쉘) :

declare -a args=()
while IFS='' read -r -d '' item; do
  args+=( "$item" )
done <file
run_your_command "${args[@]}"

해당 파일에서 읽고 내용을 사용하려면 (배열이없는 쉘에서) 로컬 명령 줄 인수 목록을 덮어 쓰므로 함수 내부에서 수행하는 것이 가장 좋습니다. 따라서 함수의 인수를 덮어 쓰지 않아야합니다. 전체 목록) :

set --
while IFS='' read -r -d '' item; do
  set -- "$@" "$item"
done <file
run_your_command "$@"

그 주 -d(다른 끝 (end-of-line) 구분 기호를 사용할 수 있도록)는 비 POSIX 확장하고, 배열이없는 쉘은 또한 그것을 지원하지 않을 수 있습니다. 이 경우 NUL로 구분 된 내용을 eval안전한 형식 으로 변환하기 위해 쉘이 아닌 언어를 사용해야 할 수도 있습니다 .

quoted_list() {
  ## Works with either Python 2.x or 3.x
  python -c '
import sys, pipes, shlex
quote = pipes.quote if hasattr(pipes, "quote") else shlex.quote
print(" ".join([quote(s) for s in sys.stdin.read().split("\0")][:-1]))
  '
}

eval "set -- $(quoted_list <file)"
run_your_command "$@"


답변

다음은 파일의 내용을 명령의 인수로 전달하는 방법입니다.

./foo --bar "$(cat ./bar.txt)"


답변

당신이해야 할 모든 arguments.txt내용과 파일을 설정하는 것 입니다

arg1
arg2
argN

로에게 my_command arg1 arg2 argN당신은 간단하게 사용할 수 있습니다 xargs:

xargs -a arguments.txt my_command

당신은 추가적인 정적 인수를 넣을 수 있습니다 xargs처럼 호출 xargs -a arguments.txt my_command staticArg하는 호출my_command staticArg arg1 arg2 argN