Bash 스크립트의 파일을 반복하고 각 파일에 대해 gdb 명령을 실행합니다.

Bash 스크립트의 파일을 반복하고 각 파일에 대해 gdb 명령을 실행합니다.

이름이 있는 파일을 찾아 bash 스크립트를 사용하여 텍스트 파일에 복사하려고 합니다.

내가 해야 할 일은 이 파일을 반복하고 각 파일에 대해 gdb 명령을 실행하고 이러한 gdb 세부 정보를 이전에 만든 동일한 파일에 인쇄하도록 명령을 추가하는 것입니다.

내가 하고 있는 일은

#!bin/bash

fpath=/home/filepath

find $fpath -name "core.*" -exec ls -larh {} \; > $fpath/deleted_files.txt
while read line; do gdb ./exec $line done; < $fpath/deleted_files.txt

아래와 같이 고유한 파일 이름을 읽어야 합니다.

gdb ./exec core.123

하지만 아래와 같이 파일을 읽고 오류가 발생합니다.

gdb ./exec -rw-rw-r-- 1 home home 0 2022-12-06 13:59 /home/filepath/core.123
gdb : unrecognised option '-rw-rw-r--'

명령에 파일 이름을 지정하고 txt 파일에 붙여넣으려면 어떻게 해야 합니까?

답변1

  1. 출력 파일에 긴 형식 목록을 원하지 않으면 -lls 옵션을 사용하지 마십시오.

  2. 이 파일이 정말 필요한가요 deleted_files.txt? 그렇지 않은 경우, 각 파일 이름을 반복할 수 있도록 만든 유일한 이유라면 find . -name 'core.*' -exec gdb /exec {} \;.

  3. 목록도 원하는 경우 다음 중 하나를 사용할 수 있습니다.

# first make sure $fpath will be inherited by
# child processes (find and bash -c)
export fpath

find . -name 'core.*' -exec bash -c '
    for corefile; do
      printf "%s\n" "$corefile" >> "$fpath/deleted_files.txt"
      gdb /exec "$corefile"
    done
   ' bash {} +

아니면 그냥 두 번 실행하세요 find:

find . -name 'core.*' > "$fpath/deleted_files.txt"
find . -name 'core.*' -exec gdb /exec {} \;

또는 배열을 사용하면 find를 한 번만 실행하면 됩니다.

# read find's output into array corefiles with mapfile.  use NUL as
# the filename separator.
mapfile -d '' -t corefiles < <(find . -name 'core.*' -print0)

# output the array to $fpath/deleted_files.txt, with a newline
# between each filename.
printf '%s\n' "${corefiles[@]}" > "$fpath/deleted_files.txt"

# iterate over the array and run gbd on each corefile.
for cf in "${corefiles[@]}" ; do
  gdb /exec "$cf"
done

그런데 변수를 인용하는 것을 잊지 마세요. 바라보다공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?그리고$VAR 대 ${VAR} 및 인용 여부

관련 정보