나는 다음 스크립트를 작성했습니다.
"find . -name '*'.cpp | $IN_REGEX | grep $IN_REGEX | grep -v $OUT_REGEX` 하다 echo "출력 파일은 $OUTPUT_FILE입니다." count=`git log --pretty=형식: --name-only $filename | grep -v ^$ | echo "$count $filename" >> $OUTPUT_FILE 완벽한
그러나 출력 파일에는 아무 것도 기록되지 않습니다.
참고:
OUTPUT_FILE
IN_REGEX
, 및 의 값을 설정했습니다OUT_REGEX
.- 루프 내부의 코드가 실행되고 있습니다.
sh -x
전화해서 확인해봤습니다 . - 삭제하면
>> $OUTPUT_FILE
출력이 표시됩니다. touch $OUTPUT_FILE
스크립트 내에서 시도해 보았는데 훌륭하게 작동합니다.
누군가 내 실수를 지적할 수 있나요?
답변1
$OUTPUT_FILE이 존재합니까? 해당 권한( ls -l $OUTPUT_FILE
, ) 은 무엇입니까 getfacl $OUTPUT_FILE
? 몇 번이나 실행되었나요 echo "Output file..."
? (나는 그것을 생략하고 싶지만 for
그것은 당신의 결정입니다)?
find ...
(귀하의 파이프가 아무것도 반환하지 않는 것 같습니다 )
답변2
이 문제를 해결하는 데 도움이 될 수 있는 몇 가지 아이디어는 다음과 같습니다.
파일로의 표준 리디렉션 대신 파일을 파이프
tee
하여 포함합니다. stdout에서 출력을 확인하고 $OUTPUT_FILE로 이동하기를 바랍니다. 예를 들어:echo "$count $filename" 티 $OUTPUT_FILE |
$OUTPUT_FILE에는 상대 경로가 아닌 절대 경로를 사용하여 호출 스크립트의 위치에 종속되지 않도록 하세요. 상대를 사용하는 경우 올바른 위치에서 출력 파일을 찾지 못할 수 있습니다.
계속해서 -x를 사용하여 스크립트를 호출하면 스크립트를 실행할 때 무슨 일이 일어나는지 정확히 확인할 수 있습니다. 리디렉션 시 $OUTPUT_FILE 값을 반드시 설정해 주세요.
sh를 사용하지 않을 경우 bash에서 스크립트를 사용해 볼 수 있습니다. 그런 다음 set 내장을 사용하여 일부 bash 옵션을 사용할 수 있습니다(참고자료 참조
help set
). 스크립트를 개발할 때 0이 아닌 종료 상태가 반환되면 스크립트가 종료되도록 "set -e"를 수행하는 것이 유용할 수 있습니다. 파이프라인 오류 상태를 처리해야 할 수도 있습니다. 따라서 디버깅을 돕기 위해 다음을 스크립트 상단에 넣을 수 있습니다.set -x set -e # Optionally: set -o pipefail