/ / Openscad -D कमांड लाइन को शेल स्क्रिप्ट - बैश, कमांड-लाइन, ओपनस्कैड से नहीं बुलाया जा सकता है

Openscad -D कमांड लाइन को शैल स्क्रिप्ट से नहीं कहा जा सकता - बैश, कमांड लाइन, openscad

मैं कमांड लाइन से मॉडल उत्पन्न करने के लिए Ubuntu linux पर Opencad कमांड का उपयोग कर रहा हूं। मैं चर मानों को ओवरराइड करने के लिए -D मापदंडों का उपयोग करके ओपनस्कैड कमांड चलाने में सफल रहा:

$ openscad -o output.stl -D "param1="name1"" -D "param2="name2"" openscad-script.scad

संपादित करें: जिस तरह से हमें पास-डी मापदंडों को नोटिस करना है, दोनों सिंगल कोट्स और डबल कोट्स की वजह से होना है Openscad प्रलेखन.

लेकिन जब मैं एक शेल स्क्रिप्ट से एक ही कमांड उत्पन्न और निष्पादित करता हूं, तो Opencad त्रुटि के साथ विफल हो जाता है:

$ ./myscript.sh value1 value2

त्रुटि: पंक्ति में पार्सर त्रुटि XX: सिंटैक्स त्रुटि "टी पार्स फ़ाइल" "Openscad-script.scad"!

कहा पे XX = फ़ाइल की अंतिम पंक्ति।

यहाँ बैश स्क्रिप्ट है

#!/bin/bash
# run openscad command
param1="-D "param1="$1"""
param2="-D "param2="$2"""
echo "openscad -o $1-$2.stl $param1 $param2 openscad-script.scad"
openscad -o $1-$2.stl $param1 $param2 openscad-script.scad

यह इतना आसान लग रहा है कि मैं अभी भी यह पता नहीं लगा सकता कि कमांड चलाने में ओपनस्कैड विफल है।

आपकी सहायता के लिए धन्यवाद,

संपादित करें: मुझे इसे काम करने का एक तरीका मिला, हो सकता है कि यह सबसे अच्छा न हो

#!/bin/bash
# run openscad command
param1="-D "param1="$1"""
param2="-D "param2="$2"""
command = "openscad -o $1-$2.stl $param1 $param2 openscad-script.scad"
eval $command

उत्तर:

जवाब के लिए 2 № 1

यदि आपकी इच्छित कमांड लाइन है:

openscad -o name1-name2.stl -D "param1="name1"" -D "param2="name2"" openscad-script.scad

... तो ऐसा करने के लिए एक सही स्क्रिप्ट होगी:

#!/bin/bash
openscad 
-o "$1-$2.stl" 
-D "param1="$1"" 
-D "param2="$2"" 
openscad-script.scad

... या, यदि आप वास्तव में किसी भी कारण से कई लाइनों में चीजों का निर्माण करना चाहते हैं:

#!/bin/bash

args=( -o "$1-$2.stl" )
args+=( -D "param1="$1"" )
args+=( -D "param2="$2"" )

openscad "${args[@]}" openscad-script.scad

openscad वस्तुतः एकल-उद्धरण जानने का कोई तरीका नहीं हैया डबल-कोट्स का उपयोग कमांड लाइन पर किया गया था, इसलिए इसके लिए एकल-उद्धरणों की आवश्यकता नहीं है। इसके अलावा, शेल उद्धृत करना एक चरित्र-दर-वर्ण विशेषता है! यानी:

"param1="name1"" # becomes the C string "param1="name1""

का परिणाम बिल्कुल उसी तार की के रूप में पारित किया जा रहा है:

param1=""name1"" # becomes the C string "param1="name1"", same as above

या

param1="""name1""" # becomes the C string "param1="name1"", same as above

... जब वे मूल्य सभी स्थिर होते हैं। कब name1 कुछ के साथ बदल दिया है $1, हालांकि, तब उपयोग में उद्धरण के प्रकार के आधार पर अर्थ बहुत अलग हो जाता है:

set -- name1; IFS=0123456789
"param1="$1"" # becomes the C string "param1="name1"", as above
"param1="$1""   # becomes the C string "param1="$1"", not substituting name1

# ...and, as an example of something to look out for:
param1="""$1"""  # becomes TWO C strings, "param1="name" and """, due to bad quoting
# ...the IFS above makes it split on numbers; by default this risk would happen with spaces

जवाब के लिए 3 № 2

लेखन से param1="-D "param1="$1""", मुझे लगता है कि आपको उम्मीद थी कि बाद में जब आप $param1, जब आप चलाते हैं तो एम्बेडेड डबल-कोट्स का पुनर्मूल्यांकन किया जाएगा openscad ... $param1 आदेश। लेकिन नहीं, वह जीता "नहीं हुआ।

जो आप चाहते हैं उसे प्राप्त करने के लिए, एक समाधान जो काम करेगा और साफ होगा वह बैश ऐरे का उपयोग कर रहा है:

#!/bin/bash
params=(-D param1=""$1"" -D param2=""$2"")
printf "%q " openscad -o "$1-$2".stl "${params[@]}" openscad-script.scad; echo
openscad -o "$1-$2".stl "${params[@]}" openscad-script.scad

मैंने भी डबल-कोट किया $1-$2, क्योंकि यह ग्लोबिंग और शब्द विभाजन को रोकने के लिए अनुशंसित है।