毎時間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"