我想在我的docker-entrypoint.sh
;上运行几个脚本。
我的问题是它是否有任何区别,如果有,推荐的解决方法是什么,关于以下选项:
一个。
${HOMEDIR}/myscript --param1 --param2
乙。
bash -c "${HOMEDIR}/myscript --param1 --param2"
C. _
source ${HOMEDIR}/myscript --param1 --param2
我想在我的docker-entrypoint.sh
;上运行几个脚本。
我的问题是它是否有任何区别,如果有,推荐的解决方法是什么,关于以下选项:
一个。
${HOMEDIR}/myscript --param1 --param2
乙。
bash -c "${HOMEDIR}/myscript --param1 --param2"
C. _
source ${HOMEDIR}/myscript --param1 --param2
这实际上取决于你在做什么以及你想做什么。
${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 ),因为我列出了它们之间的差异。