在KSH衍生过程中设置变量

时间:2012-11-08 21:58:38

标签: multithreading variables ksh

我有一个冗长的菜单脚本,它依赖于它的变量的一些命令输出。这些命令需要几秒钟来运行每个命令,我想产生新的进程来设置这些变量。它看起来像这样:

VAR1=`somecommand` &
VAR2=`somecommand` &
...
wait
echo $VAR1 $VAR2

问题是这些过程是在它们设置的变量中产生和死亡的。我意识到我可以通过将这些文件发送到文件然后读取它来做到这一点,但我想在没有临时文件的情况下这样做。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您可以使用命令替换来获取整个过程的输出,例如:

VAR1=$(somecommand &)
VAR2=$(somecommand &)
...
wait
echo $VAR1 $VAR2

答案 1 :(得分:0)

这是相当笨重的,但对我有用。我有三个脚本。

cmd.sh是您的“somecommand”,它只是一个测试脚本:

#!/bin/ksh
sleep 10
echo "End of job $1"

下面是wrapper.sh,它运行一个命令,捕获输出,完成时向父信号发出信号,然后将结果写入stdout:

#!/bin/ksh
sig=$1
shift
var=$($@)
kill -$sig $PPID
echo $var

这是父脚本:

#!/bin/ksh

trap "read -u3 out1" SIGUSR1
trap "read -p out2" SIGUSR2

./wrapper.sh SIGUSR1 ./cmd.sh one |&
exec 3<&p
exec 4>&p

./wrapper.sh SIGUSR2 ./cmd.sh two |&
wait
wait
echo "out1: $out1, out2: $out2"
echo "Ended"

2x等待,因为第一个将被中断。

在父脚本中,我运行包装器两次,每个作业执行一次,传入要运行的命令和任何参数。 |&表示“管道到后台” - 作为协同进程运行。

两个exec命令将管道文件描述符复制到fds 3和4.当作业完成时,包装器会通知主进程读取管道。使用trap捕获信号,该{{1}}读取适当子进程的管道,并收集结果数据。

相当复杂和笨重,但似乎有用。