try2:
set -vn
set -o pipefail
set -e
if grep -v '^#' file.tx | grep -P 'name' file.tx; then \
echo " No name"; exit 0;\
echo " This message is print from file.tx" \
cat file.tx; fi
1) 위의 코드는 다음과 같은 경우 grep을 시도합니다.이름에는 존재하지 않습니다파일.tx그러면 에코가 됩니다"이름 없음". 주석 처리되지 않은 줄에 단어가 없으면 그 단어를 찾고 싶지만 작동하지 않는 것 같습니다.
2) 첫 번째 진술이 거짓이면 어떻게 하시겠습니까? 두 번째 진술로 이동합니다. 위의 명령이 작동하지 않는 것 같습니다.
참고: 이 코드는 Makefile에 작성되었으며 대상 이름은 다음과 같습니다.2번 시도
답변1
질문을 이해하면 다음과 같은 파일이 있습니다.
# 마법의 단어 이름이 포함된 댓글
마법의 단어가 포함되지 않은 것
"이름 없음"이 인쇄되기를 원합니다. 첫 번째 줄의 주석 처리를 제거하면 "No name"이 인쇄되지 않습니다.
다음은 트릭을 수행해야합니다.
if grep -v '^#' file.tx | grep -q name; then
echo "no name"
fi
코드에서 두 번째 코드에는 grep
파일 이름이 포함되어 있으므로 첫 번째 코드의 파이프 입력을 보지 않습니다. 또한 Perl 정규 표현식을 사용하지 않기 때문에 해당 항목을 제거 -P
하고 -q
일치 항목이 억제된 grep
경우 인쇄될 수 있는 출력 도 추가했습니다.
답변2
문제는 name
주석이 없는 데이터를 greping하는 대신에file.tx
grep
grep -v '^#' file.tx | grep -P 'name' file.tx
^^^^^^^
will not read from pipe
대신에
grep -v '^#' file.tx | grep -q 'name'
grep
즉 , 파이프의 두 번째 파일을 원본 파일에서 읽도록 만들지 마세요 . 또한 grep
종료 상태(문에 사용됨)에만 관심이 있으므로 if
와 함께 사용하세요 -q
.
두 번째 질문을 고려하면 올바르게 이해하면 cat file.tx
문자열이 name
주석 외부에 나타나는 경우에만 실행하려는 것 같습니다. 이 경우 논리가 거꾸로 진행됩니다.
if grep -v '^#' file.ex | grep -q 'name'; then
name
주석이 아닌 줄에 문자열이 나타나면 참입니다. 파일을 원하면 cat
여기에서 수행해야 합니다.
if grep -v '^#' file.ex | grep -q 'name'; then \
cat file.tx; \
else \
echo 'No name'; \
fi
exit 0
이것이 나머지 Makefile 대상에 미치는 영향은 확실하지 않습니다 . 타겟으로 하고 싶다면실패하다name
존재하지 않으면 나중에 exit 1
실행하십시오 echo
. 그렇지 않으면 전혀 종료하지 마십시오(동일한 Makefile 대상에서 더 많은 쉘 코드를 실행하고 싶지 않은 경우).
나는 또한 현재 디렉토리가 cd ../..
그렇지 않은 한 당신의 것을 발견했습니다.file.tx
그리고디렉토리에서는 실패 ../..
할 cat
것입니다. 왜 두 개의 디렉토리로 올라가고 싶은지 언급하지 않았기 때문에 그것에 대해 많이 말할 수 없습니다.
또한 cd
쉘 조각이 완료되면 make
대상의 각 개별 라인이 별도의 쉘 인스턴스에서 실행되기 때문에 "실행 취소"됩니다. 이는 또한 set
귀하가 가지고 있는 다양한 지침이 실행되고 있음 을 의미합니다.분리껍데기.