在ubuntu linux 11.10 64位shell中完成bg任务时设置变量

在ubuntu linux 11.10 64位shell中完成bg任务时设置变量,linux,sh,ubuntu-11.10,Linux,Sh,Ubuntu 11.10,所以我有这个代码: uthreads=4 x=1 c

所以我有这个代码:

uthreads=4                                                                                                            
x=1                                                                                                                   

cd ./wxWidgets/wxWidgets/build-win                                                                                    

for upxs in $(ls ./lib/*.dll)                                                                                         
do                                                                                                                    
    while [ true ] ; do                                                                                           
            if [ $x -lt $uthreads ] ; then                                                                        
                    x=$((x+1))                                                                                    
                    (upx -qqq --best --color $upxs; x=$((x-1))) &                                                 
                    break                                                                                         
            fi                                                                                                    
            sleep 1                                                                                               
    done                                                                                                          
done                                                                                                                  
x=$((x=1))
问题在于括号中修改的变量。当然,这不会像预期的那样工作,因为变量永远不会被发送回父shell。所以我的问题是你是怎么做到的?无论upx命令处于退出状态,该变量必须在upx命令完成后递增。所以简单的&&或| |在这里不起作用。而且不能使用单个&upx之后的此处;因为这个过程会在后台运行,并立即更改变量


因此,我实际上被卡住了,需要一些帮助…

假设您试图通过控制程序在后台运行的副本数来“关闭”程序的活动,请查看
xargs
命令。我的系统没有安装
upx
,因此我可以推荐最好的代码示例是

uthreads=4                                                                                                            
cd ./wxWidgets/wxWidgets/build-win

ls ./lib/*.dll | xargs -I{} -P $uthreads upx -qqq --best --color {} 
   ^                    ^    ^           ^   ^                   ^
   +>your list          |    |           |   |                   |
                        |    |           |   |                   +> item from your lst
                        |    |           |   +> your cmd's opts
                        |    |           +> your cmd
                        |    + xargs opt for # of processes
                        + xargs  option to indicate what string to replace with           
使用
xargs--help
查看所有选项,
man-xargs
如果您有幸获得有关用法的详细信息,请在web和此处搜索更多用法示例。这是一个良好的开端


我希望这有助于

假设您试图通过控制程序在后台运行的副本数量来“控制”程序的活动,请查看
xargs
命令。我的系统没有安装
upx
,因此我可以推荐最好的代码示例是

uthreads=4                                                                                                            
cd ./wxWidgets/wxWidgets/build-win

ls ./lib/*.dll | xargs -I{} -P $uthreads upx -qqq --best --color {} 
   ^                    ^    ^           ^   ^                   ^
   +>your list          |    |           |   |                   |
                        |    |           |   |                   +> item from your lst
                        |    |           |   +> your cmd's opts
                        |    |           +> your cmd
                        |    + xargs opt for # of processes
                        + xargs  option to indicate what string to replace with           
使用
xargs--help
查看所有选项,
man-xargs
如果您有幸获得有关用法的详细信息,请在web和此处搜索更多用法示例。这是一个良好的开端


我希望这能有所帮助,首先,这:
虽然[true]
是错误的,
true
是一个命令,
[
也一样,在这里你不需要两者,只要在true时执行
;在bash中使用
[
,另一个仅用于POSIX sh)

这:
对于$(ls./lib/*.dll)中的upxs也是错误的,而且更严重;我会给你一些关于所有这些信息的链接,但现在只要做:
对于./lib/*.dll中的upxs

另一个重要的错误是你没有引用你的变量,每一个变量都必须被双引号引用,如果你从这篇文章中学到了什么,就让它吧

现在,关于你的特定问题,整个方法都是错误的,你不能做你想做的事情,因为你不知道哪个过程将首先结束,你等待一个特定的过程,或者等待所有的过程

还请注意,您正在使用同一个文件运行四个进程,我相信您的意图是并行处理4个不同的文件,而且您也不会等待它们完成,很可能在脚本结束后,您的进程会被终止

次优但简单的解决方案是让4个进程并行运行,并等待所有进程完成,然后再启动4个进程,这是通过以下方式实现的(与您当前的方法类似):

!/bin/bash
uthreads=4
cd./wxWidgets/wxWidgets/build win
upxs=(lib/*.dll)
i=0

while((i首先,这个:
while[true]
是错误的,
true
是一个命令,
[
在这里你不需要两者,只需要在true时执行
;在bash中使用
[
,另一个仅用于POSIX sh)

这:
对于$(ls./lib/*.dll)中的upxs也是错误的,而且更严重;我会给你一些关于所有这些信息的链接,但现在只要做:
对于./lib/*.dll中的upxs

另一个重要的错误是你没有引用你的变量,每一个变量都必须被双引号引用,如果你从这篇文章中学到了什么,就让它吧

现在,关于你的特定问题,整个方法都是错误的,你不能做你想做的事情,因为你不知道哪个过程将首先结束,你等待一个特定的过程,或者等待所有的过程

还请注意,您正在使用同一个文件运行四个进程,我相信您的意图是并行处理4个不同的文件,而且您也不会等待它们完成,很可能在脚本结束后,您的进程会被终止

次优但简单的解决方案是让4个进程并行运行,并等待所有进程完成,然后再启动4个进程,这是通过以下方式实现的(与您当前的方法类似):

!/bin/bash
uthreads=4
cd./wxWidgets/wxWidgets/build win
upxs=(lib/*.dll)
i=0

而((i)您可能应该将title+标记中的'linux'更改为您正在使用的任何shell以获得更好的答案。您可能应该将title+标记中的'linux'更改为您正在使用的任何shell以获得更好的答案。
#!/bin/bash

uthreads=4

cd ./wxWidgets/wxWidgets/build-win
upxs=(lib/*.dll)

i=0 pids=()
while [[ ${upxs[i]} ]]; do
    while ((${#pids[@]}<uthreads)); do
        upx -qqq --best --color "${upxs[i]}" & pids+=($!)
        [[ ${upxs[++i]} ]] || break
    done
    sleep .1
    pids=($(for pid in "${pids[@]}"; do kill -0 $pid && echo $pid; done))
done
wait