Как расширить оболочку bash? - PullRequest
3 голосов
/ 02 октября 2010

хотел бы добавить новую функциональность в оболочку bash. Мне нужно иметь очередь на казни.

Какой простой способ добавить новые функции в оболочку bash, сохранив все собственные функции? Я хотел бы обработать командную строку, а затем позволить bash выполнить их. Для пользователей это должно быть прозрачно.

Спасибо, Арман

EDIT

Я только что обнаружил, что prll.sourceforge.net делает именно то, что мне нужно.

1 Ответ

2 голосов
/ 06 марта 2012

Это проще, чем кажется:

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

while read COMMANDS; do
  eval "$COMMANDS"
done

вы можете использовать read -p, если вам нужна подсказка, или -t, если вы хотите, чтобы тайм-аут ... или, если вы хотите, вы могли бы даже использовать свойлюбимая диалоговая программа вместо чтения и передача вывода в оконный ящик

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 и добавить продолжения и разрывы, либо выбрать ядро ​​для ожидания (вероятно, последнего) и ожидания его

для ожидания завершения использования одного потока.:

wait $threadarray[$i]

для ожидания завершения использования всех потоков:

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

еще одно примечание: вы можете обнаружить, что некоторые команды не любят многопоточность, если вы можете поместитьвсе это в заявлении кейса

Я постараюсь в ближайшее время сделать некоторую очистку, чтобы собрать все маленькие блоки вместе (извините, я собираю это воедино из случайных заметок, которые я использовал для реализации этоготочная вещь, но не могу найти)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...