经验分享:子进程的子进程调用父进程的父进程的函数。

sh/bash/dash/ksh/zsh等Shell脚本
回复
fnan
帖子: 919
注册时间: 2009-07-01 22:04

经验分享:子进程的子进程调用父进程的父进程的函数。

#1

帖子 fnan » 2011-03-20 0:04

原意是整合awk与sort,利用awk的高速特性,过程中搜索有名管道使用例子,一天下来几乎搜不到, 所以贴出来,或许对像我一样的初学者有用。
效果如下:

输入要处理数字的文本路径 :s2.t
开始处理 s2.t 文本: 共有 328048 行

是否有无效数字。。。

至少两个数字?。。。

已处理了 100000 行
用时 0 小时 0 分 1 秒
已处理了 200000 行
用时 0 小时 0 分 3 秒
已处理了 300000 行
用时 0 小时 0 分 4 秒

绝对值最大数是: -123456789012345678901234567890.123456789012345678901234567892

kose5@kose5-Aspire-4552:~$

代码: 全选

#!/bin/bash

function f_get_path
{
	vf_file_path=$(echo $vf_file_path|sed -n 's/ *//p')
	if [[ ${vf_file_path:0:1} == "~" ]];then
		vf_file_path="$PWD"${vf_file_path:1}
	fi
}

function f_begin
{
	clear
	echo -n " 输入要处理数字的文本路径 :"
	read vf_file_path
	f_get_path
	if [[ ! -f $vf_file_path ]];then
		echo "     没有此文本!"
		exit 1
	else
		vg_line_count=$(wc -l < $vf_file_path)
		echo -n "    开始处理 $vf_file_path 文本:  "
		echo "    共有 $vg_line_count 行"
		echo
	fi
	echo "    是否有无效数字。。。"
	if (grep -E -n '[^0-9\. -]|\. | \.|- |[0-9][^0-9\. ][0-9]' $vf_file_path);then
		echo
		echo " 有无效数字!"
		echo
		exit 1
	else
		echo "                       无"
	fi
	echo "     至少两个数字?。。。 "
	if (grep -q '.*[0-9] [0-9].*' $vf_file_path);then
		echo "                        是"
	else
		echo " 否!"
		exit 1
	fi
	vg_time1=$(date +%s)
	export env_pts='/dev/'$(ps|sed -n '2p'|cut -d' ' -f3)    #记录pts号码, 并设为环境变量。
	export env_file_fifo="file_fifo$$"     #记录临时fifo文件名,并设为环境变量。
	mkfifo $env_file_fifo     #创建临时fifo文件。
}

function f_show_time
{
	declare -i vl_time
	vl_time=$(($(date +%s) - $vg_time1))
	declare -i vl_hour=$(($vl_time/3600))
	declare -i vl_minute=$(($vl_time%3600/60))
	declare -i vl_second=$((($vl_time%3600)%60))
	echo "	                          用时 $vl_hour 小时 $vl_minute 分 $vl_second 秒" > $env_pts
}

function f_get_fifo_order        #父进程接受子进程指令函数。
{
	local vl_order
	while read vl_order < $env_file_fifo;do
		if [[ $vl_order = "show_time" ]];then          #接受显示时间指令。
			f_show_time    #显示时间。
		elif [[ $vl_order = "close_fifo" ]];then    #接受关闭fifo文件指令。
			break   #退出。
		fi
	done
	rm $env_file_fifo   #删除fifo文件。
}

function f_read_lines
{
	f_get_fifo_order &
	vf_max=$(awk '{
		if (NR%100000 == 0) 
			{ print "  已处理了 " NR " 行"|"cat > $env_pts";    #利用pts号每两万行显示一次,不经过标准输出。
			print "show_time"|"cat > $env_file_fifo"};     #利用fifo文件调用父进程的f_show_time函数。
		split($0,al_numbers," ");
		for (i in al_numbers) print al_numbers[i]|"sort -n"
		}' $vf_file_path|sed -ne '1p' -e '$p')
	echo "close_fifo" > $env_file_fifo    #向父进程传送关闭fifo文件指令。
}

function f_show_mas
{
	local vl_n1=$(echo $vf_max|cut -d' ' -f1)
	local vl_n2=$(echo $vf_max|cut -d' ' -f2)
	local vl_n1b=$(echo $vl_n1|tr -d " -")
	local vl_n2b=$(echo $vl_n2|tr -d " -")
	echo
	if [[ $(echo "$vl_n1b > $vl_n2b"|bc) -eq 1 ]];then
		echo "      绝对值最大数是: $vl_n1"
	elif [[ $(echo "$vl_n1b < $vl_n2b"|bc) -eq 1 ]];then
		echo "      绝对值最大数是: $vl_n2"
	else 
		echo "      绝对值最大数是:  $vl_n1    和    $vl_n2"
	fi
	echo
}

#MAIN
#{
	f_begin
	export -f f_show_time
	f_read_lines
	f_show_mas
	exit 0
#}
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 经验分享:子进程的子进程调用父进程的父进程的函数。

#2

帖子 fnan » 2011-03-21 21:39

发现这句 :export env_pts='/dev/'$(ps|sed -n '2p'|cut -d' ' -f3) #记录pts号码, 并设为环境变量。
有时会失效, 改为: export env_pts='/dev/'$(ps|sed -ne '2p'|sed -n 's/.*\(pts\/[0-9]*\).*/\1/p') #记录pts号码, 并设为环境变量。
比较可靠!!!!
bash陷阱还不少, 学精真的不易!!! :em06
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: 经验分享:子进程的子进程调用父进程的父进程的函数。

#3

帖子 tusooa » 2011-04-05 8:04

关于pts的,这样比较好点吧。

代码: 全选

tlcr: 0 2011/04/05 7:57 tusooa-laptop /tmp 
● readlink /proc/$$/fd/1
/dev/pts/3
tlcr: 0 2011/04/05 7:57 tusooa-laptop /tmp 
● 

代码: 全选

] ls -ld //
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 经验分享:子进程的子进程调用父进程的父进程的函数。

#4

帖子 fnan » 2011-04-05 11:09

tusooa 写了:关于pts的,这样比较好点吧。

代码: 全选

tlcr: 0 2011/04/05 7:57 tusooa-laptop /tmp 
● readlink /proc/$$/fd/1
/dev/pts/3
tlcr: 0 2011/04/05 7:57 tusooa-laptop /tmp 
● 
直接 $(tty)就行了,当时技术就那程度 :em06
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
ptpt52
帖子: 717
注册时间: 2008-07-27 8:51
系统: Ubuntu/Windows
来自: 广西玉林|广东深圳
联系:

Re: 经验分享:子进程的子进程调用父进程的父进程的函数。

#5

帖子 ptpt52 » 2011-04-05 12:52

marks :em11
走过去了也便有了路
http://www.ptpt52.com/
回复