我正在编辑脚本,因为脚本有点长,我决定将脚本的主要部分括在大括号中,并将输出转移到日志文件,而不是为命令设置单独的日志重定向。然后我注意到一个检查脚本运行副本的命令块会产生两种不同的结果,具体取决于它是否用大括号括起来。
我将脚本运行为:
$ /bin/bash scriptname.bash
我的问题是为什么同一个命令块会返回2个不同的结果,以及是否可以让命令块在大括号内工作。
以下是命令块:
#!/bin/bash
#set -x # Uncomment to debug this shell script
#
##########################################################
# DEFINE FILES AND VARIABLES HERE
##########################################################
THIS_SCRIPT=$(basename $0)
TIMESTAMP=$(date +%Y-%m-%d_%H%M%S)
LOGFILE=process_check_$TIMESTAMP.log
##########################################################
# BEGINNING OF MAIN
##########################################################
{
printf "%s\n" "Checking for currently runnning versions of this script"
MYPID=$$ # Capture this scripts PID
MYOTHERPROCESSES=$(ps -ef | \grep $THIS_SCRIPT | \grep -v $MYPID | \grep -v grep | awk '{print $2}')
if [[ "$MYOTHERPROCESSES" != "" ]]
then
printf "%s\n" "ERROR: Another version of this script is running...exiting!"
exit 2
else
printf "%s\n" "No other versions running...proceeding"
fi
printf "%s\n" "Doing some script stuff..."
exit 0
} | tee -a $LOGFILE 2>&1
# End of script
答案 0 :(得分:1)
这不是由于支架,这是由于管道。
当您将命令与command | tee
之类的管道组合在一起时,管道的每一侧都在一个单独的子流程中执行。因此,Shell命令在子shell中执行。这就是你检测到的这个子shell。
PS:避免像ps | grep -v grep
这样的结构,使用pidof
或pgrep
代替