명령 의 결과인 Unix에서 여러 파일을 첨부하려고 합니다 find
. 메일을 보내려고 하는데 첨부파일이 없어졌습니다.
dir=$path
echo "Entered into $spr/sum_master"
for fil in `find $dir -ctime -2 -type f -name "Sum*pdf*"`
do
uFiles=`echo "$uFiles ; uuencode $fil $fil"`
done
\($uFiles\) | mailx -s "subject" [email protected]
이 코드에 어떤 문제가 있나요?
답변1
uFiles
문자열을 포함하게 되면 마지막 foo bar qux
줄에서는 (foo
인수 bar
및 를 사용하여 명령을 실행합니다 qux)
. 이로 인해 오류 메시지 (foo: command not found
(또는 유사한 메시지)가 발생하고 mail
빈 입력을 얻습니다.
스크립트의 문제는 이뿐만이 아닙니다. 변수를 구성하는 명령은 uFiles
사용자가 생각하는 것과 전혀 작동하지 않습니다. 실행하여 bash -x /path/to/script
스크립트의 흔적을 확인하면 무슨 일이 일어나고 있는지 알 수 있습니다. 명령을 실행하는 대신 명령을 echo
실행하고 있습니다 . 거기에는 uuencode
필요하지 않습니다 echo
.
uFiles="$uFiles
$(uuencode "$fil" "$fil")"
이렇게 하면 루프가 작동하지만 깨지기 쉽습니다. 특히, 공백이나 기타 특수 문자가 포함된 파일 이름에서는 중단됩니다(참조:쉘 스크립트가 공백이나 기타 특수 문자로 인해 막히는 이유는 무엇입니까?자세한 설명은) 출력을 구문 분석하는 것이 find
작업을 수행하는 가장 쉬운 방법은 아닙니다. 대신 find
실행하려는 명령을 실행하라고 지시하세요.
find "$dir" -ctime -2 -type f -name "Sum*pdf*" -exec uuencode {} {} \;
그 출력은 빌드하려고 했던 uuencoded 파일을 연결한 것입니다. 다음 항목에 직접 입력으로 전달할 수 있습니다 mail
.
find "$dir" -ctime -2 -type f -name "Sum*pdf*" -exec uuencode {} {} \; |
mailx -s "subject" [email protected]
uuencode 단계의 잠재적인 실패를 감지하려면 이를 변수에 넣을 수 있습니다(단, 매우 클 수 있다는 점에 유의하세요).
attachments=$(find "$dir" -ctime -2 -type f -name "Sum*pdf*" -exec uuencode {} {} \;)
if [ $? -ne 0 ]; then
echo 1>&2 "Error while encoding attachments, aborting."
exit 2
fi
if [ -z "$attachments" ]; then
echo 1>&2 "Notice: no files to attach, so mail not sent."
exit 0
fi
echo "$attachments" | mailx -s "subject" [email protected]
또는 임시 파일을 작성하십시오.
attachments=
trap 'rm -f "$attachments"' EXIT HUP INT TERM
attachments=$(mktemp)
find "$dir" -ctime -2 -type f -name "Sum*pdf*" -exec uuencode {} {} \; >"$attachments"
if [ $? -ne 0 ]; then
echo 1>&2 "Error while encoding attachments, aborting."
exit 2
fi
if ! [ -s "$attachments" ]; then
echo 1>&2 "Notice: no files to attach, so mail not sent."
exit 0
fi
mailx -s "subject" [email protected] <"$attachments"