Функция bash, которая запускает скрипт


Я пытаюсь написать функцию bash с именем myrun, такую, что выполнение

myrun script.py

С файлом Python:

#MYRUN:nohup python -u script.py &

import time
print 'Hello world'
time.sleep(2)
print 'Once again'

Запускает скрипт с командой, указанной в первой строке файла, сразу после #MYRUN:.

Что я должен вставить в .bashrc, чтобы разрешить это? Вот что у меня сейчас:

myrun () {
[[ "$1" = "" ]] && echo "usage: myrun python_script.py" && return 0
<something with awk here or something else?>
}
2 2

2 ответа:

Минималистская версия:

$ function myrun {
  [[ "$1" = "" ]] && echo "usage: myrun python_script.py" && return
  local cmd=$(head -n 1 < "$1" | sed s'/# *MYRUN://')
  $cmd
}

$ myrun script.py
appending output to nohup.out
$ cat nohup.out
Hello world
Once again 
$

(мне не ясно, лучше ли использовать eval "$cmd" или просто $cmd в последней строке функции, но если вы хотите включить "&" в директиву MYCMD, то $cmd проще.)

С некоторой базовой проверкой:

function myrun {
  [[ "$1" = "" ]] && echo "usage: myrun python_script.py" && return
  local cmd=$(head -n 1 <"$1")
  if [[ $cmd =~ ^#MYRUN: ]] ; then cmd=${cmd#'#MYRUN:'}
  else echo "myrun: #MYRUN: header not found" >&2 ; false; return ; fi
  if [[ -z $cmd ]] ; then echo "myrun: no command specified" >&2 ; false; return; fi
  $cmd  # or eval "$cmd" if you prefer
}

Это не имеет отношения к Баш. К сожалению, строка shebang не может переносно содержать более одного аргумента или группы параметров.

Если ваша цель-указать параметры для Python, то простейшей вещью, вероятно, является простая оболочка sh:

#!/bin/sh
nohup python -u <<'____HERE' &
.... Your Python script here ...
____HERE