Bash - for...do 루프에서 생성된 마지막 파일을 계산할 수 없습니다.

Bash - for...do 루프에서 생성된 마지막 파일을 계산할 수 없습니다.

bash 스크립트(중요한 경우 Ubuntu 22)에는 for...do 루프에서 실행되고 일부 SQLplus <query_name>.sql을 실행하고 결과를 < query_name>에 저장하는 파일 이름이 지정된 함수가 있습니다. CSV

성공 여부를 확인하고 방금 생성한 csv 파일의 크기를 인쇄하는 몇 가지 기능을 추가했습니다.

하지만... 세 가지 쿼리를 실행하고 성공 메시지에 파일 크기를 보고합니다. 문제 없습니다. 그러나 네 번째이자 마지막 항목의 경우 "Statx할 수 없습니다: 해당 파일이나 디렉터리가 없습니다"라는 오류가 발생합니다. 바로 거기에서 볼 수 있어요. 대안으로, 전체 프로세스가 디렉토리의 파일을 나열하도록 하면 그것이 나타납니다.

지난번과 같은 방식으로 작동하지 않는 이유를 알아보세요.

다음은 run_query() 및 Success_file() 함수에 대한 코드입니다. 제가 무엇을 하고 있는지 확인하시면 될 것 같습니다.

[단지 조각이 아닌 전체 스크립트 파일을 표시하도록 편집됨]

#!/bin/bash

source ~/overnights/scripts/.globals/.filenames
source ~/overnights/scripts/.globals/.creds
source ~/overnights/scripts/.globals/.commands.sh

echo "============================================================================="
echo "=  Starting to fetch Banner data                                            ="
echo "============================================================================="

# cleandrop() called from each sql script execution to finish the whole process if one file fails.
cleandrop () {
  echo "`date`: Problems connecting to or fetching from Oracle. Cleaning up and exiting."
  rm -f ${IN_BANNER}/*
  cd $SCRIPT_DIR
  exit 1
}

# Displays confirmations of which file we have just processed.
success_file () {
    size=$(stat -c%s "$2")
    echo "`date`: SQL script executed successfully for $1"
    echo "`date`: Output file saved to $2 (${size} bytes)."
    echo
}

# Given a query name from the array "queries" performs the query and saves the output.
run_query () {
    SQL="${BANNER_SCRIPTS}/$1.sql"
    CSV="${IN_BANNER}/$1.csv"
    echo "`date`: Beginning ${SQL} processing."
    sqlplus64 -S "${OUSER}/${OPASS}@//${OHOST}:${OPORT}/${OSID}" @${SQL}

# Check the exit status of sqlplus to see if the SQL script ran successfully
    if [[ $? -eq 0 ]]
    then
      success_file ${SQL} ${CSV}
    else
      cleandrop
    fi
}

# Try a connection just to make sure it works first otherwise exit
echo "exit" | sqlplus64 -L "${OUSER}/${OPASS}@//${OHOST}:${OPORT}/${OSID}" | grep Connected > /dev/null

if [[ $? -ne 0 ]]
then
   cleandrop
else
  echo "`date`: Connection checked okay, proceeding to fetch Banner data."
fi

# Remove files from previous runs if they exist.
cd $IN_BANNER

signal="${IN_BANNER}/DONE.txt"

if [[ -f "$signal" ]]
then
    echo "`date`: Removing signal file ${signal}"
    rm -f $signal
    echo "`date`: Removing any previous data files in ${IN_BANNER}"
    echo
    rm -f ${IN_BANNER}/*.csv
fi
rm -f *

# Set up the array of query names to execute with run_query()
queries=( ora_SRS_PEOPLE
          ora_SRS_COURSES
          ora_SRS_ENROLS
          ora_SRS_STAFF
          )

for query in "${queries[@]}"
do
    run_query ${query}
done

# drop in a signal file so other processes can tell if the downloads have completed.
echo "`date`: Creating completion signal file ${signal}"
touch ${signal}
echo
echo  "`date`: Listing of data files collected in ${IN_BANNER}"
ls -lh ${IN_BANNER}

cd ${SCRIPT_DIR}
echo
echo "`date`: overnights_oracle.sh completed"
exit 0

...내가 본 결과는 다음과 같습니다.

=============================================================================
=  Starting to fetch Banner data                                            =
=============================================================================
Sat Oct  7 15:55:53 BST 2023: Connection checked okay, proceeding to fetch Banner data.
Sat Oct  7 15:55:53 BST 2023: Removing signal file /home/p0071665/overnights/data/downloads/banner/DONE.txt
Sat Oct  7 15:55:53 BST 2023: Removing any previous data files in /home/p0071665/overnights/data/downloads/banner

Sat Oct  7 15:55:53 BST 2023: Beginning /home/p0071665/overnights/scripts/sql/banner/ora_SRS_PEOPLE.sql processing.
Sat Oct  7 15:57:54 BST 2023: SQL script executed successfully for /home/p0071665/overnights/scripts/sql/banner/ora_SRS_PEOPLE.sql
Sat Oct  7 15:57:54 BST 2023: Output files saved to /home/p0071665/overnights/data/downloads/banner/ora_SRS_PEOPLE.csv (10776253 bytes).

Sat Oct  7 15:57:54 BST 2023: Beginning /home/p0071665/overnights/scripts/sql/banner/ora_SRS_COURSES.sql processing.
Sat Oct  7 15:58:04 BST 2023: SQL script executed successfully for /home/p0071665/overnights/scripts/sql/banner/ora_SRS_COURSES.sql
Sat Oct  7 15:58:04 BST 2023: Output files saved to /home/p0071665/overnights/data/downloads/banner/ora_SRS_COURSES.csv (3992287 bytes).

Sat Oct  7 15:58:04 BST 2023: Beginning /home/p0071665/overnights/scripts/sql/banner/ora_SRS_ENROLS.sql processing.
Sat Oct  7 16:01:07 BST 2023: SQL script executed successfully for /home/p0071665/overnights/scripts/sql/banner/ora_SRS_ENROLS.sql
Sat Oct  7 16:01:07 BST 2023: Output files saved to /home/p0071665/overnights/data/downloads/banner/ora_SRS_ENROLS.csv (26717546 bytes).

Sat Oct  7 16:01:07 BST 2023: Beginning /home/p0071665/overnights/scripts/sql/banner/ora_SRS_STAFF.sql processing.
Sat Oct  7 16:01:11 BST 2023: SQL script executed successfully for /home/p0071665/overnights/scripts/sql/banner/ora_SRS_STAFF.sql
Sat Oct  7 16:01:11 BST 2023: Output files saved to /home/p0071665/overnights/data/downloads/banner/ora_SRS_STAFF.csv ( bytes).

Sat Oct  7 16:01:11 BST 2023: Creating completion signal file /home/p0071665/overnights/data/downloads/banner/DONE.txt

Sat Oct  7 16:01:11 BST 2023: Listing of data files collected in /home/p0071665/overnights/data/downloads/banner
total 41M
-rw-r--r-- 1 p0071665 p0071665    0 Oct  7 16:01 DONE.txt
-rw-r--r-- 1 p0071665 p0071665 3.9M Oct  7 15:58 ora_SRS_COURSES.csv
-rw-r--r-- 1 p0071665 p0071665  26M Oct  7 16:01 ora_SRS_ENROLS.csv
-rw-r--r-- 1 p0071665 p0071665  11M Oct  7 15:57 ora_SRS_PEOPLE.csv
-rw-r--r-- 1 p0071665 p0071665 1.2M Oct  7 16:01 ora_SRS_STAFF_ENROLS.csv

실행할 때 콘솔에 표시되는 내용은 다음과 같습니다.

stat: cannot statx '/home/p0071665/overnights/data/downloads/banner/ora_SRS_STAFF.csv': No such file or directory

하지만 나는 그 파일이 거기에 있다는 것을 안다. 이동하고 복사할 수 있고 ls -al 등에 나열됩니다.

stat가 파일을 찾기 전에 파일을 "닫기" 위해 뭔가를 해야 하는지 궁금했지만, 통계를 수행하기 전에 파일에 "touch" 및 "remove" 신호를 추가했는데 아무런 효과가 없었습니다. 전적으로 중요한 것은 아니지만 실행 중인 쿼리 배열의 한 요소에서만 작동하지 않는 이유가 궁금합니다.

건배, 조크

답변1

코드에 오타가 있는 것 같습니다. 아니요 ora_SRS_STAFF.csv, 따라서 오류 메시지는 정확합니다.

-rw-r--r-- 1 p0071665 p0071665    0 Oct  7 16:01 DONE.txt
-rw-r--r-- 1 p0071665 p0071665 3.9M Oct  7 15:58 ora_SRS_COURSES.csv
-rw-r--r-- 1 p0071665 p0071665  26M Oct  7 16:01 ora_SRS_ENROLS.csv
-rw-r--r-- 1 p0071665 p0071665  11M Oct  7 15:57 ora_SRS_PEOPLE.csv
-rw-r--r-- 1 p0071665 p0071665 1.2M Oct  7 16:01 ora_SRS_STAFF_ENROLS.csv

관련 정보