명령 및 옵션을 사용한 입력 리디렉션

명령 및 옵션을 사용한 입력 리디렉션

프로그램 이름과 선택적 플래그라는 2개의 매개변수를 허용하는 스크립트를 작성하려고 합니다.

입력 파일에 프로그램 명령을 실행하고 출력 파일에 출력을 저장하려고 합니다.

$input_file < $($program options) > output_file

위의 동작을 달성하기 위해 다양한 구문 조합을 시도했지만 모호한 리디렉션, I/O 오류 등과 같은 오류가 발생합니다.

예:

./execute cat -n 

프로그램 내에서 입력 파일에 cat을 적용하는 코드를 작성하고 싶습니다.

이것들은 작동하지 않습니다:

$(${1} ${2} names.txt) > test.out
names.txt < $($1 $2) > test.out

답변1

구문을 잘못 이해했습니다. 첫째, 입력 리디렉션 기호는 <파일 끝이 아닌 앞쪽에 있습니다. 작업 순서는 중요하지 않습니다. 따라서 구문은 다음과 같습니다.

< inputfile command options > outputfile

또는

command options < inputfile > outputfile

(또는 다른 순열).

글쎄, 당신은 여분의 $. 당신이 정말로 해야 할 일은

$program $options <$inputfile >$outputfile

${program}및 을 및 ${options}으로 바꿀 수 있습니다 .$1$2

이 형태로 당신은 할 수 있습니다

#!/bin/bash
<names.txt $1 $2 >test.out

여러 옵션을 원하면 ./execute cat -n또는 전화하세요. ./execute cat '-n -s'이 형식에서는 여러 옵션을 가질 수 있지만 $2따옴표 없이 따옴표로 묶어야 합니다. 공백은 인수를 다시 여러 단어로 확장합니다.

또 다른 (더 나은) 방법은 다음을 사용하는 것입니다.

#!/bin/bash
<names.txt "$@" >test.out

이제 인수에 인용된 문자열을 포함하여 원하는 만큼의 인수를 스크립트에 전달할 수 있으며, 인수는 스크립트에 전파된 후에도 함께 유지됩니다. 이제 작동합니다. ( ./execute cat -n - "bla bla.txt"이전 형식에서는 파일 이름을 두 부분으로 분할했습니다.)

답변2

가능한 해결책은 다음과 같습니다.

명령과 옵션 문자열을 연결하면 많은 괄호를 처리할 필요가 없습니다.

command="$1 $2"
$command input_file > output_file

(제가 놓친 부분이 있으면 말씀해주세요)

관련 정보