명령이 변수에 저장되면 io 리디렉션이 작동하지 않습니다.

명령이 변수에 저장되면 io 리디렉션이 작동하지 않습니다.

다음 명령을 사용하면 웹페이지에 특정 콘텐츠가 있는지 확인할 수 있습니다. 뭔가를 찾지 않으면 아무 것도 출력하지 않습니다.

curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content'

문제는 이것을 쉘 스크립트에 추가하면 출력이 더 이상 억제되지 않는다는 것입니다.

#!/bin/bash
TEST1="curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content'"

$TEST1
if [[ $? != 0 ]]; then
    #do something if exit status of last command not equal to zero
fi

VAL1스크립트의 출력 을 변수(

#!/bin/bash
TEST1="curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content'"
VAL1+=$($TEST1)
echo "result should be blank or the found grep $VAL1"

2>&1명령을 직접 실행하면 예상대로 작동하지만 스크립트에 추가하면 출력이 명령줄에 직접 표시되는 이유 는 무엇 입니까?

고쳐 쓰다

의견에 있는 Jeffs의 힌트를 통해 올바른 방향으로 나아갈 수 있었습니다. 허용되는 답변이 정확합니다. 내가 스크립트를 위해 수행한 작업은 원래 변수에 할당하려고 했던 코드를 함수로 이동하여 $( ... )모든 것이 예상대로 작동하는 것입니다.

#!/bin/bash
# note that -z checks if variable is empty
test1() {
  VAL1=$(curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content')
  if [[ -z $VAL1 ]]; then
    VAL1=test1fail
  fi
}

test1
echo $VAL1

답변1

Jeff Schaller의 댓글협회코에 있어요. Bash 매뉴얼의 주요 정보(https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command-Expansion)

간단한 명령을 실행할 때 셸은 왼쪽에서 오른쪽으로 다음과 같은 확장, 할당 및 리디렉션을 수행합니다.

  1. 파서가 변수 할당으로 표시하는 단어(명령 이름 앞의 단어) 및리디렉션나중에 처리하기 위해 저장.
  2. 변수 할당이나 방향 재지정이 아닌 단어는확장하다(바라보다쉘 확장). 확장 후 남은 단어가 있는 경우 첫 번째 단어는 명령 이름으로 처리되고 나머지 단어는 인수로 처리됩니다.
  3. 리디렉션 수행위에서 언급했듯이 (참조리디렉션).
  4. 각 변수 할당에서 "=" 뒤에 오는 텍스트는 변수에 할당되기 전에 물결표 확장, 매개변수 확장, 명령 대체, 산술 확장 및 따옴표 제거가 적용됩니다.

1단계 리디렉션을 식별하고 저장합니다.
2단계에서는 변수 확장이 발생합니다.

셸에는 1단계의 리디렉션이 표시되지 않습니다.

또한 관련:명령을 변수에 넣으려고 했지만 복잡한 경우는 항상 실패합니다!

답변2

나쁜 해결책은 이중 평가를 강제하는 것입니다.

eval "$TEST1"

좋은 해결책은 의미론적으로 명령(url, content)을 분할하는 것입니다.

curl -v --silent "$url" |& grep "$content"

참고: |&구문상의 설탕입니다.2>&1 |

관련 정보