我写了一个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中有这个功能
答案 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的本地,如函数和别名。这意味着它们可用于只有可执行文件是可行命令的情况,例如xargs
,sudo
或通过ssh
进行远程调用。
这并不提供给出默认参数的能力(或者不容易,但是IMAO)的好处大于缺点。 (在默认grep
以递归方式搜索PWD
的特定情况下,真正的解决方案是安装ack。)