一个运行脚本的bash函数

时间:2016-01-16 16:15:22

标签: python bash .bash-profile

我试图写一个名为myrun的bash函数,这样做

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 个答案:

答案 0 :(得分:1)

这与Bash无关。不幸的是,shebang行不能包含多个参数或选项组。

如果您的目标是为Python指定选项,最简单的事情可能是一个简单的sh包装器:

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

答案 1 :(得分:1)

极简主义版本:

$ 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中加入“&amp;”指令,然后$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
}