একটি ইনলাইন শেল-স্ক্রিপ্টে পরিবর্তনশীল কীভাবে প্রেরণ করবেন?


26

আমি নিম্নলিখিত স্ক্রিপ্ট চালাচ্ছি:

VAR="Test"
sh -c 'echo "Hello $VAR"'

তবে আমি পেয়েছি:

# ./test.sh
Hello

আমি কীভাবে VARআমার স্ক্রিপ্টের পরিবর্তনশীলটি তৈরি করা শেলটিতে প্রেরণ করতে পারি sh -c '...'?

উত্তর:


44

হয় exportএটিকে পরিবেশের ভেরিয়েবলে পরিণত করতে ব্যবহার করুন , অথবা সরাসরি কমান্ডে প্রেরণ করুন।

VAR="Test" sh -c 'echo "Hello $VAR"'

VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'

শেল কোডের চারপাশে দ্বিগুণ উদ্ধৃতি ব্যবহার করা থেকে বিরত থাকুন যাতে এটি কমান্ড ইঞ্জেকশন দুর্বলতার পরিচয় দেয়:

sh -c "প্রতিধ্বনি 'হ্যালো $ VAR'"

পুনরায় বুট করার কারণ যদি $VARএমন কিছু থাকে তখন ডাকা হয়';reboot #


আসলেই ব্যবহারিক নয় (আমার বেশ কয়েকটি ভেরিয়েবল রয়েছে, এবং আমি এগুলি পরিবেশের ভেরিয়েবল হতে চাই না), তবে এটি কার্যকর, ধন্যবাদ!
ম্যাথিউ নাপোলি

3
@ ম্যাথিউ: এটি আপনার উদ্বেগের কারণ যদি কেবল আপনার প্রক্রিয়াটির শিশুদের জন্য পরিবেশ পরিবর্তনশীল হিসাবে সেট করা হয় ।
পিসকভোর

5
শুধু এফওয়াইআই, আপনি export var="Test"এক লাইনেও করতে পারেন ।
ব্যবহারকারী 606723

@ পিসকভোর নির্ভুলতার জন্য আপনাকে ধন্যবাদ, এটি তখন নিখুঁত।
ম্যাথিউ নাপোলি

9

এখানে ভেরিয়েবলগুলি পাস করার আরও একটি উপায় sh -c(অবস্থানগত আর্গুমেন্ট হিসাবে):

{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}

1
(+1) স্ক্রিপ্ট ভেরিয়েবলের জন্য সাধারণ $ 1 $ 2 প্রত্যাশার সাথে এটি আরও সামঞ্জস্য রাখতে এটির ডামি মান $ 0 হতে পারে। এটি $@প্রত্যাশিত হিসাবে কাজ করার অনুমতি দেবে , যেমন। sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"`
পিটার.ও

2
@ পিটার.ও "_" ব্যবহার করার পরিবর্তে, আমি "শ" বা একটি বুদ্ধিমান নাম ব্যবহার করব সেই আদেশটি দেওয়ার জন্য, যেটি $0শেলের দ্বারা ত্রুটি / সতর্কতা বার্তায় প্রদর্শিত হয়।
স্টাফেন চেজেলাস

5

আপনি যদি এটিকে পরিবেশের ভেরিয়েবল হিসাবে রফতানি করতে না চান তবে এখানে একটি কৌশল আপনি করতে পারেন। আপনার ভের্যাব সংজ্ঞাটি একটি ফাইলে সংরক্ষণ করুন .var_init.shএবং এটি আপনার সাব-শেলটিতে এটি উত্স করুন:

.var_init.sh

VAR="Test"

কমান্ড লাইন থেকে:

sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'

এইভাবে, আপনি কেবল আপনার সাব-শেল কার্যকর করার সময় আপনার ভেরিয়েবলগুলি সেট করেছেন।


... বাENV=.var_ini.sh sh -c '...'
কুসালানন্দ

মনে রাখবেন যে যদি .var_init.shবর্তমান ডিরেক্টরিটিতে $PATHএটির . ./var_init.sh
বিধান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.