나는 명령의 결과인 여러 파일을 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"