我有一个冗长的菜单脚本,它依赖于它的变量的一些命令输出。这些命令需要几秒钟才能运行,我想生成新进程来设置这些变量。它看起来像这样:
VAR1=`somecommand` &
VAR2=`somecommand` &
...
wait
echo $VAR1 $VAR2
问题是这些进程是随着它们设置的变量而产生和死亡的。我意识到我可以通过将这些发送到一个文件然后读取它来做到这一点,但我想在没有临时文件的情况下做到这一点。有任何想法吗?
我有一个冗长的菜单脚本,它依赖于它的变量的一些命令输出。这些命令需要几秒钟才能运行,我想生成新进程来设置这些变量。它看起来像这样:
VAR1=`somecommand` &
VAR2=`somecommand` &
...
wait
echo $VAR1 $VAR2
问题是这些进程是随着它们设置的变量而产生和死亡的。我意识到我可以通过将这些发送到一个文件然后读取它来做到这一点,但我想在没有临时文件的情况下做到这一点。有任何想法吗?
这相当笨重,但对我有用。我有三个脚本。
cmd.sh 是你的“一些命令”,它只是一个测试脚本:
#!/bin/ksh
sleep 10
echo "End of job $1"
下面是wrapper.sh
,它运行单个命令,捕获输出,完成后向父级发出信号,然后将结果写入标准输出:
#!/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
,读取适当子进程的管道,并收集结果数据。
相当复杂和笨重,但它似乎工作。
您可以使用命令替换获得整个过程的输出,例如:
VAR1=$(somecommand &)
VAR2=$(somecommand &)
...
wait
echo $VAR1 $VAR2