Bash स्क्रिप्ट में वेरिएबल नामों का उपयोग कर संकलित करें



shell ubuntu (1)

जब यह कमांड चलाया जाता है:

$FORTRAN_COMPILER $LINKERFLAGS lagrit_main.o lagrit_main.f

इसे इस तरह टर्मिनल द्वारा पार्स किया जाता है:

gfortran '-O -fcray-pointer -fdefault-integer-8 -m64 -Dlinx64 -c -o' lagrit_main.o lagrit_main.f

आप देख सकते हैं कि लिंकर झंडे को एक स्ट्रिंग के रूप में समझाया जाता है, और स्ट्रिंग के रूप में gfortran को पारित किया जाता है। यह त्रुटि की जड़ है

हल करने के बजाय लिंकर झंडे को एक सरणी के रूप में परिभाषित करना है, जिसमें प्रत्येक तर्क इस सरणी में एक तत्व है:

LINKERFLAGS=(-O  -fcray-pointer -fdefault-integer-8 -m64 -Dlinx64 -c -o)
$FORTRAN_COMPILER ${LINKERFLAGS[*]} lagrit_main.o lagrit_main.f || exit 1

मैं एक बास स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो कि एक इंस्टॉलेशन स्वचालित करता है (मुझे पता है, मुझे पता है, मुझे make का इस्तेमाल करना चाहिए), और इसका उद्देश्य सामान्य होना है: अलग-अलग कंपाइलर का समर्थन करना और झंडे बनाना।

उदाहरण के लिए, मुझे ये रेखाएं हैं:

$FORTRAN_COMPILER $LINKERFLAGS lagrit_main.o lagrit_main.f
$FORTRAN_COMPILER $LINKERFLAGS lagrit_fdate.o lagrit_fdate.f
make $MAKEFLAG lib
$FORTRAN_COMPILER $BUILDFLAGS $LAGRIT_NAME $BUILDLIBS $BUILDSUFFIX

साथ चर के रूप में सेट

FORTRAN_COMPILER=gfortran
LINKERFLAGS="-O -fcray-pointer -fdefault-integer-8 -m64 -Dlinx64 -c -o"
BUILDFLAGS="-O -Dlinx64 -fcray-pointer -fdefault-integer-8 -fno-sign-zero -o"
BUILDLIBS="lagrit_main.o lagrit_fdate.o lagrit_ulin64_o_gcc.a $LAGRIT_UTIL_DIR/util_ulin64_o_gcc.a"
BUILDSUFFIX="-L$ACCESS -lexodus -lexoIIv2for -lnetcdf -lm -lstdc++"
MAKEFLAG="MOPT=64"

जो ये त्रुटियां लौटाता है:

 gfortran: error: lagrit_main.o: No such file or directory
 gfortran: error: lagrit_fdate.o: No such file or directory

 gfortran: error: lagrit: No such file or directory
 gfortran: error: lagrit_main.o lagrit_fdate.o  lagrit_ulin64_o_gcc.a /scratch/sft/livingston/build/shared/LaGriT/lg_util/src/util_ulin64_o_gcc.a: No such file or directory

लेकिन, जब मैं एक ही आदेश को लंबे समय के रूप में चलाता हूं (यानी, gfortran -O -fcray-pointer -fdefault-integer-8 -m64 -Dlinx64 -c -o lagrit_main.o lagrit_main.f ) यह कोई समस्या नहीं के साथ बनाता है

मुझे यहां क्या समझ नहीं आ रहा है? मैंने चर लाइनों के विभिन्न क्रमांतरों की कोशिश की है, जिनमें शामिल हैं:

gfortran $LINKERFLAGS lagrit_main.o lagrit_main.f
"$FORTRAN_COMPILER" "$LINKER_FLAGS" lagrit_main.o lagrit_main.f
${FORTRAN_COMPILER} ${LINKER_FLAGS} lagrit_main.o lagrit_main.f

जो सभी एक ही त्रुटि में परिणाम।

संपादित करें : स्पष्टीकरण के लिए, यह Ubuntu 16.04 पर है





gfortran