source
或"."命令了?例如,如果我编写了一个名为“sup”的脚本,我希望以以下方式调用它:sup Argument
与其
source sup Argument
或者. sup Argument
我想在脚本中使用 cd
命令。
source
或"."命令了?例如,如果我编写了一个名为“sup”的脚本,我希望以以下方式调用它:sup Argument
与其
source sup Argument
或者. sup Argument
我想在脚本中使用 cd
命令。
Bash在它或你的内核甚至考虑在其中执行的操作之前就派生并启动了一个子shell。 这不是您可以“撤消”的事情。 因此,不,这是不可能的。
谢天谢地。
相反,请查看bash
函数:
sup() {
...
}
将它放在你的~/.bashrc
中。
Executing a script spawns a new process inside which the script is running. This is done by typing the script name, if it is made executable and starts with a
#!/bin/bash
line, or directly invoking
/bin/bash mycmd.sh
Sourcing a script runs it inside its parent shell (i.e. the one you are typing commands into). This is done by typing
source mycmd.sh
or . mycmd.sh
如果一个没有被引用的脚本中的 cd 操作,是永远不会传递到其父 Shell 的,因为这将违反进程隔离。
如果你只关心 cd 操作,可以使用 cd "快捷方式" 来摆脱脚本... 查看 bash 文档,在 CDPATH 环境变量中了解更多。
否则,您可以使用别名来输入单个命令,而无需使用 source 或 . 。
alias mycmd="source mycmd.sh"
alias sup=". ~/bin/sup"
或者类似这样。
回答counter-example的评论:在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)的实验结果也显示出相同的行为。
如果您在调用子shell时,想从当前环境中获取脚本是不可能的。
但是,您可以检查脚本是否被获取,并强制脚本在未被获取时终止:
if [ -z "$PS1" ] ; then
echo "This script must be sourced. Use \"source <script>\" instead."
exit
fi
if [ "$PS1" ] ; then
echo "This script cannot be sourced. Use \"./<script>\" instead."
return
fi
echo -e
不是理想的选择 -- 即使 shell 总是 bash,有时它会根据 xpg_echo
和 posix
标志的值而在输出中打印 -e
(由于 POSIX 的 echo
规范仅允许对 -n
进行特殊处理,因此严格遵守 POSIX 的 echo
不允许对 -e
执行任何操作,除了在输出中打印它)。请参阅 https://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html,尤其是 APPLICATION USAGE 和 RATIONALE 部分。 - Charles Duffy>&2 echo 'This script must be sourced.'
)。否则,这是非常好的建议! - Max Truxa