我想在我的docker-entrypoint.sh
上运行几个脚本;
关于以下选项,我的问题是,它是否起作用以及是否起作用,建议的解决方法是什么?
A 。
${HOMEDIR}/myscript --param1 --param2
B 。
bash -c "${HOMEDIR}/myscript --param1 --param2"
C 。
source ${HOMEDIR}/myscript --param1 --param2
答案 0 :(得分:1)
这实际上取决于您在做什么以及您想做什么。
${HOMEDIR}/myscript --param1 --param2
这将执行脚本。脚本完成后,对环境所做的任何更改都将被丢弃。
bash -c "${HOMEDIR}/myscript --param1 --param2"
运行bash -c "my command here"
与仅运行my command here
与运行bash -c
的主要区别在于,前者启动一个子shell,后者运行当前shell中的命令。
但是,效果有很多差异:
在子Shell中对环境所做的更改不会影响 父外壳(当前目录,环境变量的值, 函数定义等)
在父外壳中设置的变量 尚未导出的子外壳将不可用。
Here是我的参考,因为我对source ${HOMEDIR}/myscript --param1 --param2
不太了解
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
#Import data
X_hist = pd.read_csv('X.csv') # predictors-total 7
y_hist = pd.read_csv('y.csv') # predictand as a rainfall
X_pred = pd.read_csv('X_predictors.csv') # test data of predictors- 7
#Preprocessing
X_hist.head()
y_hist.head()
X_pred.head()
#converted into np arrays
X_hist1=np.array(X_hist)
y_hist1=np.array(y_hist)
X_pred1=np.array(X_pred)
#changed the variable name for my reference
X_train=X_hist1
X_test=X_pred1
y_train=y_hist1
#Feature Scaling
from sklearn.preprocessing import StandardScaler
sc_x=StandardScaler()
sc_y=StandardScaler()
x =sc_x.fit_transform(X_train)
y =sc_y.fit_transform(y_train)
# Training SVR to dataset
from sklearn.svm import SVR
regressor = SVR(kernel = 'rbf')
regressor.fit(x,y)
#Predict using Regression Model
y_pred = sc_y.inverse_transform(regressor.predict(sc_x.transform(np.array(X_test))))
pred1=pd.DataFrame(y_pred)
pred1.to_csv("results.csv")
调用source(或其别名)时,会将脚本插入当前的bash进程中。因此,您可以读取脚本设置的变量。
调用sh时,将启动一个fork(子进程),该fork运行一个新的/ bin / sh会话,该会话通常是bash的符号链接。在这种情况下,子脚本完成时将删除由子脚本设置的环境变量。
也是here我的参考。
TL; DR:如果您不希望bash保留将要运行的脚本所需的更改,建议您使用( A )。如果要让bash保留变量和更改,请使用( C )。如果要保留更改并使bash在另一bash上运行脚本,请使用( B ),因为我列出了两者之间的差异。