在 Solaris 10 上使用 Bourne shell,定义了许多不在 .profile 中的环境变量。这些在哪里以及如何定义?
我有一个持有这条路径的 shell 变量
/usr/share/man/man1/bitmap.1
可能有一个名为 bitmap.1 的文件,但也可能是 bitmap.1.z、bitmap.1.gz、bitmap.1.Z。
现在我想将真实文件传递给一个函数,同时解析正确的文件,比如
function process {
# do something
}
path="/usr/share/man/man1/bitmap.1"
process ${path}.(z|Z|gz) # here the shell shall resolve the real filename
有没有办法优雅地做到这一点,或者我必须测试 bitmap.1、bitmap.1.z 等是否退出,然后将该文件传递给函数???
忘了说我仅限于 Bourne-Shell,所以手头没有 Brace Expansion -,-。
我需要删除部分
man1/bmtoa.1.gz
从完整路径
/usr/share/man/man1/bmtoa.1.gz
从而导致
/usr/share/man/
我试过 ${path#[!/]*/*} 和 ${path#/*/*} 但都导致错误的路径。
我有以下脚本,当我在提示符下键入脚本名称(logscript)时,它会正常运行:
#!/bin/sh
dvar=`date +"%m\/%d\/%y"`
filedate=`date +%b%d%Y`
echo DSS1 > serverlog_${filedate}.txt
grep "^$dvar" oasErrLog >> serverlog_${filedate}.txt
echo CMX1 >> serverlog_${filedate}.txt
ssh GVECMX1 grep "^$dvar" /home/gve/log/oasErrLog >> serverlog_${filedate}.txt
echo CMX2 >> serverlog_${filedate}.txt
ssh GVECMX2 grep "^$dvar" /home/gve/log/oasErrLog >> serverlog_${filedate}.txt
echo XIS1 >> serverlog_${filedate}.txt
ssh GVEXIS1 grep "^$dvar" /home/gve/log/oasErrLog >> serverlog_${filedate}.txt
echo XIS2 >> serverlog_${filedate}.txt
ssh GVEXIS2 grep "^$dvar" /home/gve/log/oasErrLog >> serverlog_${filedate}.txt
scp serverlog_${filedate}.txt "GVEXOSR2:C:/Documents\ and\ Settings/gve/Desktop/logs"
#rm serverlog_${filedate}.txt
样本正常输出为:
DSS1
01/11/10 03:00:08.139 XIS run_backupserver - Startup of XISBACKUP backupserver complete.
CMX1
01/11/10 04:30:05.710 OMNICOMM 30274 - boatimesync: error 3 from boaRx rtu 35 pretry 1 {protocols/boa/boa_command.c:601}
01/11/10 04:30:12.117 OMNICOMM 30274 - CRC (0FFC) does not match calculated CRC (03B0) for remote JRS. headerLength=5 dataLength=0 crcByteOffset=2 functionCode=1 {protocols/boa/boa_io.c:1177}
CMX2
XIS1
XIS2
01/11/10 03:00:10.563 XIS run_backupserver - Startup of XISBACKUP backupserver complete.
但是当我设置一个 CRON 作业时,它运行并 scps 文件,但内容错误,并且文件不在服务器上(当 rm 行被注释掉时,就像我上面显示的那样)。这是我得到的输出,但请注意:输出会发生变化,它的输出会有所不同:
DSS1
CMX1
01/11/10 001/11/10 04:30:05.710 OMNICOMM 30274 - boatimesync: error 3 from boaRx rtu 35 pretry 1 {protocols/boa/boa_command.c:601}
01/11/10 04:30:12.117 OMNICOMM 30274 - CRC (0FFC) does not match calculated CRC (03B0) for remote JRS. headerLength=5 dataLength=0 crcByteOffset=2 functionCode=1 {protocols/boa/boa_io.c:1177}
CMX2
CMX2
CMX2
CMX2
XIS1
XIS1
XIS1
XIS1
XIS2
01/1101/11/10 001/11/10 03:00:10.563 XIS run_backupserver - Startup of XISBACKUP backupserver complete.
关于手动输入命令时为什么 CRON 作业没有像系统运行它一样运行它的任何想法?
编辑: 我已将脚本修改为循环并使用所有绝对寻址,并使用 SHELL、PATH 和 HOME 变量修改了 CRON 文件,但输出仍然不稳定,现在是脚本:
#!/bin/sh
### internal variable definitions
dvar=`date +"%m\/%d\/%y"`
filedate=`date +%b%d%Y`
# add the prefix of new hosts into the string below
# which will be expanded later into GVE(whatever) while looping
HOSTLIST="DSS1 CMX1 CMX2 XIS1 XIS2"
# main Loop
for SUFFIX in $HOSTLIST
do
echo $SUFFIX >> /home/gve/log/serverlog_${filedate}.txt
ssh GVE$SUFFIX grep "^$dvar" /home/gve/log/oasErrLog \
>> /home/gve/log/serverlog_${filedate}.txt
echo "\n" >> /home/gve/log/serverlog_${filedate}.txt
done
# transfer and delete file
scp /home/gve/log/serverlog_${filedate}.txt \
"GVEXOSR2:C:/Documents\ and\ Settings/gve/Desktop/logs"
#rm serverlog_${filedate}.txt
这是输出:
DSS1
01/1201/12/10 03:00:08.323 XIS run_backupserver - Startup of XISBACKUP backupserver complete.
1
01/12/101/12/10 00:00:37.003 agc - dbioLower: DNP prev cmd may still in prog, name NPC_GT3_GOV raiseTimeout 1250 lowerTimeout 2500 curtime(1263286837:3) cmd_time(1263286834:807)
01/12/10 02:14:57.545 OMNICOMM 1562 - CRC (F110) does not match calculated CRC (1110) for remote ARS. headerLength=5 dataLength=10 crcByteOffset=7 functionCode=2 {protocols/boa/boa_io.c:1177}
CMX2
XIS1
XIS1
XIS2
01/12/101/12/10 03:00:10.408 XIS run_backupserver - Startup of XISBACKUP backupserver complete.
请注意某些行上的混乱日期,“1”而不是“CMX1”和被欺骗的“XIS1”。
最终编辑:
看起来 CRON 不知何故催生了多个相互绊倒的进程。在杀死所有适用的进程后,它理顺了。CRON 有错误的多进程生成的历史(如果您对其进行一些网络搜索),所以要小心。
在 bourne shell 脚本 (#!/bin/sh) 中,如何检查远程 NFS 共享是否已挂载,如果未挂载,则挂载它?目前,我有一组丑陋的 cat、greps 和 ifs 使用“mount”的输出,但它似乎并没有做可靠的工作。