2012-11-30 54 views
2

是否可以实现bash脚本的子命令。我想到的是这样的:带bash的子命令

http://docs.python.org/dev/library/argparse.html#sub-commands

+0

不知道你在得到什么。你可以添加一个程序调用“svn”,然后解析所有的svn命令。以一种所有bash的方式调用子命令。 – kdubs

+0

argparse对支持命令行界面的程序进行标记分析,例如'git clean -df'将被解析为'clean'子命令,'-df'是'clean'特定的标志。 – LavaScornedOven

+0

这是可能的,但你必须实现你自己的参数解析器来处理子命令。 – koola

回答

7

这里有一个简单的不安全技术:

#!/bin/bash 

clean() { 
    echo rm -fR . 
    echo Thanks to koola, I let you off this time, 
    echo but you really shouldn\'t run random code you download from the net. 
} 

help() { 
    echo Whatever you do, don\'t use clean 
} 

args() { 
    printf "%s" options: 
    while getopts a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:p:q:r:s:t:u:v:w:x:y:z: OPTION "[email protected]"; do 
    printf " -%s '%s'" $OPTION $OPTARG 
    done 
    shift $((OPTIND - 1)) 
    printf "arg: '%s'" "[email protected]" 
    echo 
} 

"[email protected]" 

这一切都非常酷,但它不限制子命令可能是什么。所以你可能想要用最后一行代替:

if [[ $1 =~ ^(clean|help|args)$ ]]; then 
    "[email protected]" 
else 
    echo "Invalid subcommand $1" >&2 
    exit 1 
fi 

有些系统让你在子命令前加上“全局”选项。如果需要,可以在子命令执行之前放置一个getopts循环。在落入子命令执行之前,请记住shift;同样,将OPTIND重置为1,以便子命令getopts不会感到困惑。

+1

您确实应该回应该rm命令以确保安全,或添加免责声明。 – koola

+1

@koola,是的,你说得对。尽管我认为帮助文本是一个免责声明,连同“不安全”一词。 – rici