zsh脚本[进程完成]不返回shell

时间:2014-06-04 15:29:23

标签: linux shell zsh

我写了一个zsh函数来帮助我做一些我的工作。

   function rgrep (){ 
if [ -n "$1" ] && [ -n "$2" ]
then
    exec grep -rnw $1 -r $2
elif [ -n "$1" ]
then
    exec grep -rnw $1 -r "./"
else
    echo "please enter one or two args"
fi  
}

效果很好,然而,grep完成执行我不会被抛回shell。它只是挂在[过程完成]任何想法? 我在.zshrc中有这个功能

3 个答案:

答案 0 :(得分:3)

请勿使用exec替换现有的shell。

  

exec [-cl] [-a name] [command [arguments]]

     

如果提供了命令,它将替换shell而不创建新进程。如果提供了-l选项,则shell会在传递给command的第0个参数的开头放置一个破折号。这是登录程序的功能。 -c选项导致在空环境中执行命令。如果提供了-a,则shell将name作为命令的第0个参数传递。如果未指定命令,则可以使用重定向来影响当前的shell环境。如果没有重定向错误,则返回状态为零;否则返回状态为非零。

请改为尝试:

rgrep ()
{ 
    if [ -n "$1" ] && [ -n "$2" ]
    then
        grep -rnw "$1" -r "$2"
    elif [ -n "$1" ]
    then
        grep -rnw "$1" -r "./"
    else
        echo "please enter one or two args"
    fi  
}

答案 1 :(得分:3)

除了删除不必要的exec之外,您还可以删除if语句。

function rgrep (){
    grep -rwn "${1:?please enter one or two args}" -r "${2:-./}"
}

如果未设置$1(或空值),则会引发错误并显示给定的消息。如果未设置$2,则会在其位置使用默认值./

答案 2 :(得分:1)

作为一种完全不同的方法,我喜欢将这样的命令快捷方式构建为最小的shell脚本,而不是函数(或别名):

% echo 'grep -rwn "$@"' >rgrep
% chmod +x rgrep
% ./rgrep
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
% 

(这取决于Unix的传统行为:没有#!行的可执行文本文件被视为shell脚本,由/bin/sh执行。如果这不适用于您的系统,或者您需要在zsh下专门运行,使用适当的#!行。)

这种方法的一个主要好处是,PATH目录中的shell脚本是环境的完整公民,而不是当前shell的本地,如函数和别名。这意味着它们可用于只有可执行文件是可行命令的情况,例如xargssudo或通过ssh进行远程调用。

这并不提供给出默认参数的能力(或者不容易,但是IMAO)的好处大于缺点。 (在默认grep以递归方式搜索PWD的特定情况下,真正的解决方案是安装ack。)