从脚本中导入bashrc失败

3
我写了一个简单的 bash 脚本,可以自动将别名添加到我的 .bashrc 文件中,并且在脚本完成后,我希望它能够加载 .bashrc 文件。
目前为止,它已经正常工作,例如:
./addalias.sh ls 'ls -l' 

该代码正确地将“alias ls ='ls -l'”附加到.bashrc中,但不会对其进行源代码。

代码如下:

#!/bin/bash
FIRST=$1

SECOND=${2:-cd `pwd`}

echo alias $FIRST="'$SECOND'" >> /home/oscar/.bashrc
echo alias $FIRST="'$SECOND'"

source /home/oscar/.bashrc

这种方法行不通,运行别名("sourcebash")来替代最后一行也不行。

你有什么想法可以解决这个问题吗?


2
除非我错了,你的脚本将分叉一个shell进程并在那里被引用。当脚本完成时,对该shell的任何更改也会消失。我不知道有什么解决办法,但也许其他人可以帮忙。 - gpojd
无关的是,您可以用SECOND=${2:-cd \pwd`}替换if`语句。 - chepner
3个回答

3

运行 'addalias.sh' 的 shell 会加载 .bashrc 文件;然后退出。它不会且无法影响父 shell 的环境。

你需要这样调用命令:

source ./addalias.sh ls 'ls --color=auto'

或者:

. ./addalias.sh ls 'ls --color=auto'

(现在已修复: 我并不相信,即使是在提问中,使用sudo rm -fr /* 进行玩弄是明智的。这样做存在太多易错风险而毫无意义。)


没错。已修复,谢谢。 也许有一种方法可以编写一个函数,在所有shell中调用.bashrc文件吗? - bezi
不行,每个 shell 都是独立的,必须单独引用 .bashrc 文件。 - Jonathan Leffler

1
也许你可以将它变成一个函数或别名,而不是一个bash脚本。这样做可能会导致更改在同一个shell中发生。

0
我会创建一个别名来调用这个“addalias”脚本,然后源化新修改的文件。
类似这样的东西
alias really_add_alias="addalias.sh; . .bashrc"

必须是一个函数,否则脚本将无法获取其参数(.bashrc的源) - fork0
addalias() { addalias.sh "$@"; . ~/.bashrc; } 的意思是:添加别名。 - fork0
是的,在你的.bashrc中也要放入这个函数。我建议你最好将别名添加到其他文件中,而不是你的.bashrc。这样更安全。从addalias()函数中获取的源代码也会更少。 - fork0
该函数与别名执行相同的操作,但不会将其作为源。它会将文本正确附加到.bashrc文件中。 - bezi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接