2

我想在我的docker-entrypoint.sh;上运行几个脚本。

我的问题是它是否有任何区别,如果有,推荐的解决方法是什么,关于以下选项:

一个

${HOMEDIR}/myscript --param1 --param2

bash -c "${HOMEDIR}/myscript --param1 --param2"

C. _

source ${HOMEDIR}/myscript --param1 --param2
4

1 回答 1

3

这实际上取决于你在做什么以及你想做什么。

${HOMEDIR}/myscript --param1 --param2

这将执行脚本。脚本完成后,它对环境所做的任何更改都将被丢弃。

bash -c "${HOMEDIR}/myscript --param1 --param2"

运行bash -c "my command here"与仅运行my command here的主要区别在于前者启动一个子 shell,后者在当前 shell 中运行命令。

但是,效果有许多不同之处:

  • 在子 shell 中对环境所做的更改不会影响父 shell(当前目录、环境变量的值、函数定义等)

  • 在父 shell 中设置的尚未导出的变量在子 shell 中将不可用。

是我的参考,因为我不太了解bash -c

source ${HOMEDIR}/myscript --param1 --param2

当您调用 source(或其别名 .)时,您将脚本插入到当前 bash 进程中。所以你可以读取脚本设置的变量。

当你调用 sh 时,你启动了一个 fork(子进程),它运行一个新的 /bin/sh 会话,这通常是一个到 bash 的符号链接。在这种情况下,由子脚本设置的环境变量将在子脚本完成时被删除。

这里也是我的参考。

TL;DR:如果您不希望 bash 使用您将运行的脚本保留您想要的更改,我建议您使用 ( A )。如果您希望 bash 保留变量和更改,请使用 ( C )。如果您想保留更改并让 bash 在另一个 bash 上运行脚本,请使用 ( B ),因为我列出了它们之间的差异。

于 2018-08-31T07:21:26.153 回答