我正在编写一个函数来./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