- 论坛徽章:
- 0
|
本帖最后由 newzy 于 2014-08-06 19:07 编辑
[引入]
在linux环境下工作,alias可能为复杂难记的或长长的命令取个别名;alias 不能提供可变参数,就会经常写定大大小不的脚本简化这些操作。
比如常常会:
mkdir -p foo/bar
cd foo/bar
因为alias 不能在命令中间提供可变参数,于是就产生类似 mkcd.sh 的脚本:
function mkcd (name) {
mkdir -p $name;
cd $name;
}
是不是可以有一个类似 printf(fmt, ...) 的命令,fmt 于于列出要执行命令的序列串,用%1,%2,%3表示后面将要传入的参数呢?如:
some_exec "mkdir %1; cd %1" foo/bar
它会将 "mkdir %1; cd %1" 中的 %1 替换成 foo/bar,然后再执行之
这样就可以:
alias mkcd=some_exec "mkdir %1; cd %1"'
以后再要创建 foo/bar 并进入这个目录时,就可以直接:
mkcd foo/bar
如果需要到多个参数时,只要在alias 的格式串时用%1, %2, %3,... 依次表示第一,第二个参数就可以了。
假如我们有一个 make 命令:
make [-j4] -DFOO_DEF=XXX -DBAR_DEF=YYY [CPU=MIPS|ARM] foo_imagename
本处假设 [-j4] [CPU=MIPS] 只能出现在make后,foo image前有某处,
就可以定义:
alias mkfoo=some_exec "make %1 -DFOO_DEF=XXX -DBAR_DEF=YYY %2 foo_imagename"'
alias mkbar=some_exec "make %1 -DFOO_DEF=XXX -DBAR_DEF=YYY %2 bar_imagename"'
保存到~/.bashrc里,这样我们可以用下面的命令了:
mkfoo -j4
mkfoo -j4 CPU=MIPS
mkfoo CPU=MIPS
mkbar -j4
...
这样的 alias + some_exec就能立大功了。它能让我们少记少重复好多事。
[进阶]
看下 alias mkfoo='some_exec "fmt"' 还是有些丑陋,是不是还可以这样:
some_aliax fmt
就是直接用 some_alias 直接为一个格式串取别名,以上命令看起来像这样:
some_alias "mkdir %1; cd %1"
some_alias mkfoo=make %1 -DFOO_DEF=XXX -DBAR_DEF=YYY %2 foo_imagename'
some_alias mkbar=make %1 -DFOO_DEF=XXX -DBAR_DEF=YYY %2 bar_imagename'
是不是有时候会忘记自定义命令的格式或参数,是不是可以直接在some_alias 里再定义下自定义的帮助信息,
如:
some_alias 'mkdir %1; cd %1' 'mkcd [dirname]'
some_alias mkfoo=make %1 -DFOO_DEF=XXX -DBAR_DEF=YYY %2 foo_imagename' 'mkfoo [-j4] [CPU=MIPS|ARM]"
some_alias mkbar=make %1 -DFOO_DEF=XXX -DBAR_DEF=YYY %2 bar_imagename' 'mkfoo [-j4] [CPU=MIPS|ARM]"
保存到~/.bashrc里,这样我们就可以这样看到它们的帮助了:
$mkdir
mkdir [dirname]
$mkdir -h
mkdir [dirname]
$mkfoo -h
mkfoo [-j4] [CPU=MIPS|ARM]
...
[高级]
以上的 some_alias 默认是至少输入一个参数,如果没有参数就会显示帮助信息。
如果遇到参数个数至少几个的,如上面的 mkcd 至少要一个参数,而 mkfoo 最少确可以为零个参数,就是不输入任何参数也行。
直接在命令的最后用 -n [0-9] 指定参数个数吧,像这样:
some_alias mkfoo=make %1 -DFOO_DEF=XXX -DBAR_DEF=YYY %2 foo_imagename' 'mkfoo [-j4] [CPU=MIPS|ARM]" -n 0
就可以不用输入参数了
$mkfoo
如果指定的不是 -n 0, 而是 -n 2,那就是至少要两个参数了,参数不够就显示处自定义帮助。
是不是还可以指定verbose模式呢,这时回显原始执行的命令呢,这样的辅助可能会就更清析明了些。
如:
some_alias "mkdir %1; cd %1" -v
这样执行过程:
$mkcd foo/bar
%CMD: mkdir -p foo/bar; cd foo/bar
用%CMD提示了原始命令,当然还会有个相当的 -s (suppress mode) 可以抑制输出命令提示。
[关于代码]
some_exec 和 some_alias 只是抛砖引玉,附录的code里用的是 xexec 和 xalias.
习惯把它保存存成 .xexec.sh,然后在 ~/.bashrc 里 source .xexec.sh, 然后再定义些可变参数的命令。
本人不是bash的高手,只是借以提高工作效率。在这里给大家交流下,希望这个超级 alias 也帮大家有帮助。
$ xexec
Powered by newzyer@sina.com xexec v1.0.5
Usage: xecec [[-u|--usage string] | [[-s|--suppress] | [-v|--verbose]] | [-e|escape the '#' and '^' to " and \'] | [-E|disable escape the '#' and '^' | [-n|--
$ xalias
Powered by newzyer@sina.com xexec v1.0.5
Usage: xalias [name] [%pattern] [help] [-s|-v|-n #]
- #
- # xexec.sh - Do args replecement and Execute the command in arg1
- #
- # modification history
- # --------------------
- # 01a, 2012-3-24 newzy create
- #
- # Function:
- # xexec arg1 arg2 arg3 ...
- #
- # This fucntion will execute the command in arg1. Before execute the
- # arg1, it tries to replace the keywords, such as %1 %2 %3 ... and or
- # @1 @2 @3 ..., with arg2 arg3 arg4 ... sequentially.
- #
- # E.g.: xexec "echo %2 %1" arg1 arg2
- #
- # xalias [name] [%pattern] [help] [-s|-v]
- _xalias_help_='"xalias [name] [%pattern] [help] [-s|-v|-n #]"'
- _xalias_exec_='"alias %1='\''xexec -e -u \"%3\" %4 %5 %6 %7 %8 %9 \"%2\"'\''"'
- alias xalias='xexec -s -u '"$_xalias_help_ $_xalias_exec_"''
- unset _xalias_help_
- unset _xalias_exec_
- function xexec() {
- # parser parameters . . .
- local copyright="Powered by [url=mailto:newzyer@sina.com]newzyer@sina.com[/url] xexec v1.0.5\n"
- local usage="${copyright}Usage: xecec [[-u|--usage string] |"
- usage="$usage [[-s|--suppress] | [-v|--verbose]] |"
- usage="$usage [-e|escape the '#' and '^' to \" and \'] |"
- usage="$usage [-E|disable escape the '#' and '^' |"
- usage="$usage [-n|--minargs #] [%pattern] arg1 arg2 ..."
- local minargs=1;
- local escquot=0;
- local verbose=1;
- while [ -n $# ]; do
- case "$1" in
- -s) verbose=0; ;; # suppress mode
- -v) verbose=1; ;; # verbose mode
- -e) escquot=1; ;; # escape the '#' '^' to '\"' and '\''
- -E) escquot=0; ;; # disable escape the '#' '^'
- -u|--usage)
- usage="${copyright}Usage: $2"; shift; ;;
- -n|--minargs)
- [ "$2" -ge "0" ] && minargs="$2"; shift; ;;
- -*)
- echo "%Error: Unsupported option: $1";
- return; ;;
- ""|\?|-h|--help|-*)
- echo -e "${usage}\n";
- return; ;;
- *) break; ;;
- esac
- shift
- done
- # no enough args, show usage
- minargs=`expr $minargs + 1`
- [ "$#" -lt "$minargs" ] && echo -e "${usage}\n" && return;
- [[ "-h" == "$2" ]] && echo -e "${usage}\n" && return;
- # Look the first paramter as request-executed command
- local _cmd=$1; shift;
- if [ ! -z "$_cmd" ]; then
- # Replace args "%1, %2, ..." with input arguments
- local argc argv arg; argc=0
- for arg in "$@"; do
- argv[$argc]=$arg; argc=`expr $argc + 1`;
- done;
- for ((i=0,j=1; i < 10; i++,j++)); do
- # remove unused args
- arg=${argv[$i]};
- # escape the % to @< to avoid be replaced
- [ ! -z "$arg" ] && arg=${arg//\%/\@<};
- #echo "arg: ${arg}"
- [ -z "$arg" ] && _cmd=${_cmd//"\%$j "/$arg};
- [ -z "$arg" ] && _cmd=${_cmd//"\%$j "/$arg};
- # replace args "%1 %2 ...
- _cmd=${_cmd//\%$j/$arg};
- _cmd=${_cmd//@$j/$arg};
- done;
- # escand the "#" and "^" to '"' and "'"
- [ "$escquot" -gt 0 ] && _cmd=${_cmd//#/\"};
- [ "$escquot" -gt 0 ] && _cmd=${_cmd//^/\'};
- # restore the '@<' to '%'
- _cmd=${_cmd//\@</\%};
- # Execute command
- [ "$verbose" -gt 0 ] && echo "%CMD: $_cmd"
- eval $_cmd;
- fi;
- }
复制代码 |
|