Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 带grep和ps-ef的字符串周围的括号[]_Bash_Grep_Brackets_Ps - Fatal编程技术网

Bash 带grep和ps-ef的字符串周围的括号[]

Bash 带grep和ps-ef的字符串周围的括号[],bash,grep,brackets,ps,Bash,Grep,Brackets,Ps,我正在尝试获取进程开始的时间。 通常,我在运行的进程的第一个字母上使用括号。 它删除ps输出中的自报告“grep” #!/bin/bash set -x restarTXG="sendevent -E FORCE_STARTJOB -J CASPERRT_CD_TXG_DR_STR_PS" bounceTXG="sendevent -E FORCE_STARTJOB -J CASPERRT_CD_TXG_DR_STP_PS; sleep 10 ; sendevent -E FORCE_STAR

我正在尝试获取进程开始的时间。 通常,我在运行的进程的第一个字母上使用括号。 它删除ps输出中的自报告“grep”

#!/bin/bash

set -x
restarTXG="sendevent -E FORCE_STARTJOB -J CASPERRT_CD_TXG_DR_STR_PS"
bounceTXG="sendevent -E FORCE_STARTJOB -J CASPERRT_CD_TXG_DR_STP_PS; sleep 10 ; sendevent -E FORCE_STARTJOB -J CASPERRT_CD_TXG_DR_STR_PS"
timeofTXG=$(ps -ef | grep [t]xg | awk '{print $5}' )

if [ -n "$timeofTXG" ] ; then
    printf "%s\n" "The TXG_DR is ON as of $timeofTXG"
else
    printf "%s\n" "'The TXG_DR is OFF"
fi 
18:40是我运行检查脚本的时间。17:44是流程开始的时间

++ ps -ef
++ grep '[t]xg'
++ awk '{print $5}'
+ timeofTXG='17:44
18:40
18:40'
+ '[' -n '17:44
18:40
18:40' ']'
+ printf '%s\n' 'The TXG_DR is ON as of 17:44
18:40
18:40'
The TXG_DR is ON as of 17:44
18:40
18:40
我真的不知道方括号是怎么工作的。当我从命令行运行ps时,[]括号起作用--ps-ef | grep[t]xg | awk'{print$5}' 但是在bash脚本的上下文中,它们不起作用,它们给了我自我报告grep的时间。
支架是如何工作的?为什么它们在命令行中工作而不是在脚本中工作?如何摆脱bash脚本中自我暴露的grep?

如果您正在运行
awk
您已经不需要
grep
,请执行以下操作(我想这是您的意图):


如果当前目录中存在同名文件,则需要使用引号防止shell将
[t]xg
替换为
txg
。也就是说,代码应该是
'[t]xg'
…或者,更好的是,不要使用grep
ps
,而是使用一个专用工具,例如
pgrep
。或者,甚至更好的是,不要查看进程表,而是编写软件来使用建议锁定或操作系统提供的进程监控系统(systemd、runit、daemontools、upstart、launchd,不管是什么)。方括号是。你应该小心使用一个你并不真正理解的工具。每当你看到某件事情“仅仅因为它有效”而被完成时你通常应该试着找出它为什么会起作用,因为只要情况稍有变化,你就很难将你不知道的东西适应你的新情况。@Davy是的-我正在齐心协力地理解这些工具。我一点也不相信
ps-ef
的输出定义得足够好s保证您想要的列(带有可执行文件名)在所有相关平台上都是
$8
。是的,
-f
由POSIX保证提供“完整列表”,它保证了一组特定的字段,但每个字段的内容——因此,
awk
将其解析为一个字段还是多个字段——都是实现定义的。@CharlesDuffy非常正确,但是,其目的是表明,如果管道中有
awk
,则可能不需要
grep
,这是用于su的你比把整条线放大更受限制。
ps -ef | awk '$8 ~ /txg/ {print $5}'