간단한 질문이 있는데 제가 직접 답변할 수는 없습니다. 아래에 결과를 인쇄한 후 공백으로 표시되는 변수가 있습니다.
스크립트:
core_out=find coretst.*
echo "$core_out"
Result: No display *blank*
#tried to echo without double quotes as well but it has the same result
그런데 저는 퍼티를 사용하고 있습니다.
실제 목표: 1. /opt/datintdv/Informatica/9.6.1/server/bin --dir1에서 core.*를 확인합니다. - core.*가 존재하고 1보다 큰 경우 1개의 core.*를 가져온 다음 문자열을 실행합니다(core. . * )| grep "pmdtm(" --script1 script1이 작동하지 않으면 실행 파일(코어 파일 이름) 인수에 출력을 저장합니다. 전체 코어까지.실행된 후 출력이 변수에 저장됩니다. - dir1에 core.*가 없는 경우 /opt/datintdv/Informatica/9.6.1/tomcat/bin을 확인하십시오. core.*가 존재하고 1보다 큰 경우 1개의 core.*를 가져온 다음 문자열(core.*)을 실행하십시오. ) | grep "pmdtm(" --script1 script1이 작동하지 않으면 실행 파일(코어 파일 이름)에 대한 인수에 출력을 저장합니다. 전체 코어까지.실행된 후 출력이 변수에 저장됩니다. *개행 문자로 구분된 출력
- 모든 출력을 가져와 이메일 본문에 연결합니다.
- 이메일을 통해 사용자에게 보냅니다. *현재 스크립트를 작성 중인데 처음이라 어렵네요.
당신이 나를 도울 수 있기를 바랍니다! 감사해요!
답변1
명령의 결과를 인라인으로 사용하는 것을 의미하는 명령 대체는 를 통해 수행됩니다 $( ... )
.
당신에 관한 한,
core_out=$( find coretst.* )
그러나 이렇게 하면 으로 시작하는 모든 경로가 확장되는 모든 경로 find
로 시작하는 모든 경로를 찾으라는 메시지가 표시됩니다. coretst.*
나는 당신이하고 싶은 것이 현재 디렉토리 또는 그 아래 디렉토리를 찾는 것이라고 가정합니다.문서패턴을 일치시킵니다 coretst.*
. 당신은 이것을 할 것입니다
core_out=$( find . -type f -name 'coretst.*' )
패턴 을 인용하면 coretst.*
쉘이 패턴을 현재 디렉토리의 이름으로 확장하는 것을 방지합니다.
그러면 문제는 이것이 반환한 경로 이름으로 무엇을 하려는가 하는 것입니다. 그냥 인쇄하고 싶다면 변수가 전혀 필요하지 않습니다.
find . -type f -name 'coretst.*'
당신이 할 의향이 있다면제거하다파일이 있는 경우 다음에서 이 작업을 수행해야 합니다 find
.
find . -type f -name 'coretst.*' -exec rm {} +
파일에 대한 다른 작업도 내에서 수행할 수 있습니다 find
.
질문 참조 "찾기 결과를 반복하는 것이 왜 나쁜 습관입니까?” find
반환된 경로를 사용하는 것이 나쁜 습관일 수 있는 이유(대답은 루프의 결과에 관한 것입니다 find
. 내 생각에 이는 나중에 수행하고 싶을 수도 있습니다).
댓글에서:
현재 폴더에서 검색하고 싶고 해당 출력은 하위 문자열에 대한 것이므로 이에 사용됩니다.
strings ($core_out) | grep "pmdtm("
내가 올바르게 이해했다면 이것은 다음을 통해 작동합니다.
find . -type f -name 'coretst.*' -exec strings {} + | grep -F 'pmdtm('
즉, strings
발견된 모든 파일을 실행하고 strings가 포함된 행을 찾으십시오 pmdtm(
.
어떤 파일에서 일치 항목이 발견되었는지 알고 싶다면 다음을 수행하세요.
find . -type f -name 'coretst.*' -exec sh -c '
for name; do
if strings "$name" | grep -qF "pmdtm("; then
printf "%s\n" "$name"
fi
done' find-sh {} +