在shell登录时导入Git Bash中的特定功能时出错

时间:2016-03-22 13:53:43

标签: bash shell unix git-bash

一旦我登录bash shell,我就会收到这个不寻常且烦人的错误:

sh: PATHRE: line 4: syntax error near unexpected token `('
sh: PATHRE: line 4: ` echo c:\Users\Chris Ross\bin;.;C:\RailsInstaller\Git\local\bin;C:\RailsInstaller\Git\mingw\bin;C:\RailsInstaller\Git\bin;c:\ImageMagick-6.9.2-Q16;c:\Python27\;c:\Python27\Scripts;c:\Program Files (x86)\Intel\iCLS Client\;c:\Program Files\Intel\iCLS Client\;c:\WINDOWS\system32;c:\WINDOWS;c:\WINDOWS\System32\Wbem;c:\WINDOWS\System32\WindowsPowerShell\v1.0\;c:\Program Files\Intel\Intel(R) Management Engine Components\DAL;c:\Program Files\Intel\Intel(R) Management Engine Components\IPT;c:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;c:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;c:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;c:\Program Files\Intel\WiFi\bin\;c:\Program Files\Common Files\Intel\WirelessCommon\;c:\Program Files (x86)\PDFtk Server\bin\;c:\RailsInstaller\Ruby1.9.3\bin\;c:\Program Files (x86)\Shoes;c:\Program Files (x86)\QuickTime\QTSystem\;c:\xampp\apache\bin;c:\xampp\php;c:\xampp\mysql\bin\;c:\Program Files\nodejs\;c:\Users\Chris Ross\AppData\Roaming\npm;c:\Program Files\Sublime Text 3\;c:\utils\ffmpeg\bin;c:\Program Files (x86)\GnuWin32\bin\;c:\utils;c:\Python27\;c:\Python27\Scripts;c:\Program Files\ImageMagick-6.9.2-Q16;c:\Program Files (x86)\PDFtk Server\bin;c:\RailsInstaller\Ruby1.9.3\bin;c:\utils\wget-1.11.4-1-bin\bin;c:\utils\iview441_x64;c:\Program Files\Tracker Software\PDF Editor\;c:\Program Files\processing-2.2.1;c:\Program Files\Audacity;c:\utils\Calibre Portable\Calibre;c:\Users\Chris Ross\dotfiles\bin | tr ':' '\n' | while read x; do'
sh: error importing function definition for `PATHRE'

Chris Ross@MACHINE ~

这仅影响以下函数,尽管函数本身按预期工作且没有错误:

pathre ()
{
    local idx=0;
    local regex='.*';
    [[ ! -z "${1}" ]] && regex="${1}";
    echo "${PATH}" | tr ':' '\n' | while read -r x; do
        (( idx+=1 ));
        echo "${idx} ${x}";
    done | grep -i "${regex}"
}

无论是位于~/.bashrc来源的文件还是位于~/.bashrc的文件中,都会发生错误。

该函数简单地将路径分隔符替换为新行以迭代,然后grep查找子字符串。它看起来像这样:

$ pathre
1 /c/Users/Chris Ross/bin
2 .
3 /usr/local/bin
[etc...]

并使用args:

$ pathre dot
51 /c/Users/Chris Ross/dotfiles/bin
67 /c/Users/Chris Ross/dotfiles/bin

我在Windows 10计算机上的Console2中使用Git Bash,我使用RailsInstaller软件包安装了它。

$ bash --version
GNU bash, version 3.1.20(4)-release (i686-pc-msys)
Copyright (C) 2005 Free Software Foundation, Inc.

感谢。

1 个答案:

答案 0 :(得分:0)

您确定导致问题的确切代码是什么?因为它看起来不像。

对于初学者,错误显示为PATHRE,您的代码使用pathre

其次,错误中的代码表示路径在正在运行的命令上展开(实际上,很可能实际正在运行的命令)并且路径的值是问题。

因此我希望您的代码看起来更像这样:

PATHRE ()
{
    local idx=0;
    local regex='.*';
    [[ ! -z "${1}" ]] && regex="${1}";
    ${PATH} | tr ':' '\n' | while read -r x; do
        (( idx+=1 ));
        echo "${idx} ${x}";
    done | grep -i "${regex}"
}

如果是这种情况,那么您可以通过实际使用代码段中的代码和/或找到PATHRE代码并删除它来解决问题(因为它可能在某个地方,你只是没有看到它。

那说这恰好是一个写得很差的功能。

这个awk - 使用功能要好得多。

pathre() {
    awk -v RS=: -v re="$1" '!re || $0 ~ re {print NR,$0}' <<<"$PATH"
}