매시간 nmon 데이터를 수집하는 스크립트가 있습니다.
#!/bin/bash
# olympics_yymmdd_HHMM.nmon
time_stamp=`date +"%y%m%d"`
h_name="$HOSTNAME"
exec > /var/log/nmon_capture.log
n_name=$h_name"_"$time_stamp"_*.nmon"
n_dir="/var/log/nmon_data"
cd $n_dir
sleep 1m
pwd
ls -al $n_name
#
/usr/bin/nmon -f -t -s 60 -c 1440 -m $n_dir
gzip $n_name
ls -al
exit
디버그 출력에는 목록 파일에 문제가 있음이 표시됩니다. 그러나 이것은 다른 서버에서는 잘 작동합니다.
# bash -x /usr/bin/nmon_capture
++ date +%y%m%d
+ time_stamp=170217
+ h_name=olympics
+ exec
+ n_name='olympics_170217_*.nmon'
+ n_dir=/var/log/nmon_data
+ cd /var/log/nmon_data
+ sleep 1m
+ pwd
+ ls -al 'olympics_170217_*.nmon'
ls: cannot access olympics_170217_*.nmon: No such file or directory
+ /usr/bin/nmon -f -t -s 60 -c 1440 -m /var/log/nmon_data
+ gzip olympics_170217_1504.nmon
+ ls -al
+ exit
답변1
할당하면 오른쪽이 참조로 처리됩니다.
n_name=$h_name"_"$time_stamp"_*.nmon"
따라서 별표( *
)는 문자 그대로 변수에 포함됩니다.
경로에 별표가 있는 일반적인 경우처럼 확장되지 않습니다.
디렉토리에 별표 표시된 파일이 없을 수 있으므로 파일을 찾을 수 없으며 오류가 발생합니다 ls
.
또한 별표 확장이 실제로 작동하도록 하려면 파일이 있는 디렉터리에서 수행해야 합니다.
a_dir=/dir_to_file
n_name=$(echo "${a_dir}/${h_name}_${time_stamp}_"*".nmon")
n_dir="/var/log/nmon_data"
cd "$n_dir"
또한 쉘 옵션을 사용하는 것은 매우 좋은 생각입니다 nullglob
.
shopt -s nullglob
*
해당 이름의 파일이 없을 때 보관을 피하기 위해 .
또는 다음 옵션을 사용하는 것이 더 좋습니다 failglob
.
shopt -s failglob
파일을 찾을 수 없으면 명시적 오류를 발생시킵니다.
a_dir=/dir_to_file
n_name=$(shopt -s failglob; echo "$a_dir/${h_name}_${time_stamp}_"*".nmon")
(( $? )) && exit 1
필요에 따라 "$n_dir" 값을 조정하십시오(문제에 대한 설명에서는 명확하지 않습니다).
그리고 기본적으로 확장 기능을 인용해 주세요. 예를 들면 다음과 같습니다.ls -al "$n_name"