运行 在 bash 脚本中用大括号命令时的不同结果
Different results when running commands in braces within a bash script
我正在编辑一个脚本,由于脚本有点长,我决定将脚本的主要部分括在大括号中并将输出转移到一个日志文件,而不是对命令进行单独的日志重定向。然后我注意到检查脚本的 运行ning 副本的命令块会给出 2 个不同的结果,具体取决于它是否包含在大括号中。
我运行脚本为:
$ /bin/bash scriptname.bash
我的问题是为什么相同的命令块 returns 2 个不同的结果,以及是否可以让命令块在大括号内工作。
命令方块如下:
#!/bin/bash
#set -x # Uncomment to debug this shell script
#
##########################################################
# DEFINE FILES AND VARIABLES HERE
##########################################################
THIS_SCRIPT=$(basename [=12=])
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 }')
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
这不是大括号的问题,这是管道的问题。
当您将命令与像 command | tee
这样的管道结合使用时,管道的每一侧都在单独的 sub-process 中执行。 Shell 命令因此在 sub-shell 中执行。就是你检测到的这个sub-shell
PS:避免像 ps | grep -v grep
这样的结构,使用 pidof
或 pgrep
代替
我正在编辑一个脚本,由于脚本有点长,我决定将脚本的主要部分括在大括号中并将输出转移到一个日志文件,而不是对命令进行单独的日志重定向。然后我注意到检查脚本的 运行ning 副本的命令块会给出 2 个不同的结果,具体取决于它是否包含在大括号中。
我运行脚本为:
$ /bin/bash scriptname.bash
我的问题是为什么相同的命令块 returns 2 个不同的结果,以及是否可以让命令块在大括号内工作。
命令方块如下:
#!/bin/bash
#set -x # Uncomment to debug this shell script
#
##########################################################
# DEFINE FILES AND VARIABLES HERE
##########################################################
THIS_SCRIPT=$(basename [=12=])
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 }')
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
这不是大括号的问题,这是管道的问题。
当您将命令与像 command | tee
这样的管道结合使用时,管道的每一侧都在单独的 sub-process 中执行。 Shell 命令因此在 sub-shell 中执行。就是你检测到的这个sub-shell
PS:避免像 ps | grep -v grep
这样的结构,使用 pidof
或 pgrep
代替