Bash 递归调用失败

Bash 递归调用失败

我正在编写一个函数来./bashrc切换环境变量、命令等。该函数应该设置必要的变量,然后调用自身。相反我得到

bash: ./bash: No such file or directory

我的脚本中的函数.bashrc如下:

switch() {
    EXISTS="$(ls ~/br/*$1 2> /dev/null)"
    if [ -z "EXISTS" ]; then
        BR="$1*"
        export PS1="...."
    else
        # Find "export BRANCH=" in .bashrc and replace it with input
        sed -i "0,/export/BRANCH=/{s/export BRANCH=.*$/export BRANCH\"$1\"/}" ~/.bashrc

        ./$0
    fi
}

我看到了这个帖子,递归调用脚本,但我不确定问题是否相同。

编辑

我的目标是基本上更改环境变量、别名等。因此,在我的 bash 脚本中,我最初会有以下内容:

export WORKNAME="br-190"
export BRANCH="~/$WORKNAME"
export WORKSPACE="~/workspace-${WORKNAME}"

alias sw='cd $BRANCH/source'
alias fix='mv ~/.good-files $WORKSPACE'

switch() {
   ... See Above ...
}

目标是WORKNAME在命令行上进行更改,例如

switch br-104

答案1

第一个明显的问题是:

if [ -z "EXISTS" ]; then

那将总是为真,因为您正在检查是否细绳 EXISTS是空的。由于它是一个字符串,因此它永远不会为空。你想这样做:

if [ -z "$EXISTS" ]; then

ls此外,用于此类事情也是不好的做法,并且对脚本变量名称使用大写字母也是不好的做法。仅对环境变量使用大写,这样您就可以避免名称重叠。

下一个主要问题是您正在打电话./$0$0就是bash这样./$0./bash不存在。想必您想做的就是重新阅读.bashrc

当然,您的sed命令(即使在更正语法错误之后)将始终与自身匹配。您需要确保使用实际的 sed 命令跳过该行,例如仅在行的开头进行匹配(另请注意更正):

sed -i "/^export BRANCH=/{s/export BRANCH=.*$/export BRANCH="$1\"/}" ~/.bashrc

但你可以简化为:

sed -i "s/^export BRANCH=.*$/export BRANCH="$1\"/" ~/.bashrc

把这些放在一起,你可能想要这样的东西:

switch() {
  shopt -s nullglob
  exists=(~/br/*"$1")
  if [ -z "$exists" ]; then
    ## Are you sure you want the * there? That will expand to all
    ## files and directories beginning with $1
    BR="$1*"
    export PS1="...."
  else
    # Find "export BRANCH"a"
    sed -i "s/export BRANCH=.*$/export BRANCH=\"$1\"/" ~/.bashrc
    . ~/.bashrc
    fi
}

答案2

.bashrc被获取时,运行命令被简单地称为bash

这又意味着./$0扩展到

./bash

因为bash不是当前目录中的文件,所以您会收到该错误消息。您不想执行它,而是想获取它,因此.和 文件名之间必须有空格。否则,.引用当前工作目录。

. ~/.bashrc

相关内容