如何扩展Bash shell?

3
我希望为bash shell添加新功能。我需要一个执行队列。
有什么简单的方法可以在保留所有本地函数的情况下为bash shell添加新功能?我想处理命令行,然后让bash执行它们。对于用户来说,这应该是透明的。
谢谢Arman
编辑:
我刚刚发现了prll.sourceforge.net,它正好符合我的需求。

1
你说的“排队执行”是什么意思?你是指同时运行多个命令吗?如果是的话,bash已经可以做到了,只需要用分号将命令分隔开即可。 - ubiquibacon
是的,但我的意思是:假设有a&b&c&d,而您只有2个CPU,我希望同时仅运行2个进程。 - Arman
4
虽然不是通用解决方案,但如果要并行运行相同的命令列表,则 xargs-P 标志可以实现此功能,parallel 也支持 -j+0 开关,自动检测 CPU 数量。请注意,这些方法不会改变原来的意思。 - Nick
@Nick:谢谢,Nick。在这种情况下,我也可以使用带有-j选项的Makefile。 - Arman
所以...标题中的问题是如何扩展shell,但实际上有一个非常特定的用例,如果回答了扩展机制的一般问题而没有解决该用例,那么答案就不适用。此外,该用例的描述方式过于一般化,无法在问题中轻松理解,只有在评论中才能澄清。对这个问题打-1分。 - Charles Duffy
1个回答

2

比看起来容易得多:

#!/bin/sh
yourfunctiona(){ ...; }
...
yourfunctionz(){ ...; }
. /path/to/file/with/more/functions

while read COMMANDS; do
  eval "$COMMANDS"
done

如果您需要提示,可以使用read -p,如果您想设置超时,则可以使用-t... 或者,如果您想要,甚至可以使用您喜欢的对话框程序替换read,并将输出导向tailbox

touch /tmp/mycmdline
Xdialog --tailbox /tmp/mycmdline 0 0 &
COMMANDS="echo "
while ([ "$COMMANDS" != "" ]); do
  COMMANDS=`Xdialog --stdout --inputbox "Text here" 0 0`
  eval "$COMMANDS"
done >>/tmp/mycmdline &

要在线程中执行命令,您可以使用以下命令替换eval $COMMANDS

#this will need to be before the loope
NUMCORES=$(awk '/cpu cores/{sum += $4}END{print sum}' /proc/cpuinfo)

for i in {1..$NUMCORES};do
  if [ $i -eq $NUMCORES ] && #see comments below
  if [ -d /proc/$threadarray[$i] ]; then #this core already has a thread
#note: each process gets a directory named /proc/<its_pid> - hacky, but works
    continue
  else #this core is free
    $COMMAND &
    threadarray[$i]=$!
    break
fi
done

接下来讨论当你填满所有线程的情况。

你可以将整个过程放在一个while循环中,并添加continue和break语句,或者选择一个核心线程(可能是最后一个)并等待它完成。

要等待单个线程完成,请使用:

wait $threadarray[$i]

要等待所有线程完成,请使用以下方法:

 wait
#I ended up using this to keep my load from getting to high for too long

另外注意:你可能会发现一些命令不喜欢被线程化,如果是这样,你可以将整个东西放在一个case语句中。

我会尽快进行清理,把所有的小块放在一起(抱歉,我从随机笔记中拼凑出这个东西,但似乎找不到了)。


抱歉,这需要额外的几行代码,具体取决于您想要支持多少个线程(听起来您已经有了一个函数)。您更喜欢使用带有bashisms的简单代码还是更长但更可移植的shell代码,可以在busybox ash/hush上运行? - technosaurus
如果我编写正确的Makefile,我可以使用make -j ntreads并行调用,但是对于bash来说有点棘手。 - Arman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接