이름이 있는 파일을 찾아 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
출력 파일에 긴 형식 목록을 원하지 않으면
-l
ls 옵션을 사용하지 마십시오.이 파일이 정말 필요한가요
deleted_files.txt
? 그렇지 않은 경우, 각 파일 이름을 반복할 수 있도록 만든 유일한 이유라면find . -name 'core.*' -exec gdb /exec {} \;
.목록도 원하는 경우 다음 중 하나를 사용할 수 있습니다.
# 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} 및 인용 여부