Bash에서 중괄호를 사용하여 다음 명령을 어떻게 실행할 수 있나요?

Bash에서 중괄호를 사용하여 다음 명령을 어떻게 실행할 수 있나요?

내 bash 스크립트에는 다음 내용이 있습니다

CMD="{ head -n1 $DATE.$FROMSTRAT.new && egrep -i \"$SYMS\" $DATE.$FROMSTRAT.new; } > $DATE.$TOSTRAT.new" 
echo "Running $CMD"                                                                                     
`$CMD`                                                                                                  

내가 스크립트를 호출할 때

Running { head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new
script.sh: line 17: {: command not found 

하지만 { head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new명령줄에서 실행하면 제대로 작동합니다.

탈출을 시도했지만 {실패했습니다. 어떻게 해야 하나요?

답변1

음, 명령줄에서 이러한 변수를 사용하면 단어로 분할되지만 이는 {( 또는 ) 등과 같은 구문 항목을 구문 분석한 후에 발생합니다. if따라서 이것을 원한다면 다음을 사용해야 합니다.eval

CMD="{ echo blah ; echo bleh; } > output"
eval "$CMD"
# output contains "blah" and "bleh"

evalnote는 변수 할당을 포함하여 현재 셸의 변수에 있는 모든 것을 실행 하지만 ( IFS예를 들어 변경 사항은 스크립트의 나머지 부분에 흥미로운 영향을 미칠 수 있습니다). bash -c "$CMD"최소한 변수 할당 문제를 완화하기 위해 별도의 셸에서 실행할 수 있습니다 .

또한 백틱은 명령의 출력을 캡처하여 명령줄에서 사용하는 데 사용되므로 $CMD출력도 명령으로 실행됩니다.

$ CMD="echo foo"
$ `$CMD`
-bash: foo: command not found

출력을 파일로 리디렉션하는 것은 중요하지 않지만 대부분 필요하지 않을 수도 있습니다.

답변2

노력하다

function exec_cmd() {
    printf "+ %s \n\n" "$1"
    bash -c "$1" || exit 1
}

exec_cmd '{ head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new' 

그러면 문자열 이스케이프에 대해 걱정할 필요가 없습니다. 사용법에
유의하세요 . 다음 매개변수 는 (스크립트 내 스크립트의 "이름") 로 사용되고 후속 매개변수는 위치 매개변수($1, $2 등)가 됩니다.bash -c <command><command>$0

관련 정보