有没有办法将脚本标记为“作为源运行”,因此您不必添加source
或“。”每次命令它?也就是说,如果我写一个名为“sup”的脚本,我想将其称为
sup Argument
而不是
source sup Argument
或
. sup Argument
基本上,我正在尝试在脚本中使用cd
。
答案 0 :(得分:29)
Bash在它或你的内核甚至考虑它应该在那里做什么之前以分贝的方式分叉和星。这不是你可以“撤消”的东西。所以不,这是不可能的。
值得庆幸的。
改为查看bash
函数:
sup() {
...
}
将其放入~/.bashrc
。
答案 1 :(得分:23)
运行shell时,有两种方法可以调用shell脚本:
执行脚本会生成一个运行脚本的新进程。这是通过键入脚本名称来完成的,如果它是可执行的并以a开头
#!/bin/bash
行,或直接调用
/bin/bash mycmd.sh
Sourcing 脚本在其父shell(即您正在键入命令的那个)中运行它。这可以通过输入
source mycmd.sh
或. mycmd.sh
因此,未来源的shell脚本中的cd never 将传播到其父shell,因为这会违反进程隔离。
如果 cd 是您感兴趣的全部内容,您可以使用cd“快捷方式”删除脚本...在CDPATH环境变量中查看bash文档。
否则,您可以使用别名来键入单个命令,而不是源或。:
alias mycmd="source mycmd.sh"
答案 2 :(得分:9)
为其创建别名:
alias sup=". ~/bin/sup"
或沿着这些方向。
另请参阅:Why doesn't cd work in a bash shell script?
通过反例回答评论:在Solaris 10上使用Korn Shell进行实验表明我能做到:
$ pwd
/work1/jleffler
$ echo "cd /work5/atria" > $HOME/bin/yyy
$ alias yyy=". ~/bin/yyy"
$ yyy
$ pwd
/work5/atria
$
在Solaris 10上使用Bash(3.00.16)进行的实验也显示了相同的行为。
答案 3 :(得分:4)
如果在调用时对脚本进行子shell,则无法在当前环境中获取脚本。
但是,您可以检查脚本是否来源并强制脚本终止,如果不是:
if [ -z "$PS1" ] ; then
echo -e "This script must be sourced. Use \"source <script>\" instead."
exit
fi
同样,你可以强制不要获取脚本,而是改为使用子shell(保留当前的shell环境):
if [ "$PS1" ] ; then
echo -e "This script cannot be sourced. Use \"./<script>\" instead."
return
fi
这两个版本都可以作为要点:请参阅please source和don't source。