শেল স্ক্রিপ্টগুলিতে হাইব্রিড কোড। ভেরিয়েবলগুলি ভাগ করা


10

টার্মিনালে কমান্ড লাইন থেকে একাধিক-লাইন পাইথন স্নিপেট কীভাবে চালানো যায় তা এই উত্তরটিতে আলোচনা করা হয়েছে। আমি লক্ষ্য করেছি যে উত্তরটি শেল স্ক্রিপ্টগুলির মধ্যে দুর্দান্ত কাজ করে, এমনকি নেস্টেড ইনডেন্টেশন সহ, যা খুব সুন্দর, উদাহরণস্বরূপ

#!/bin/bash
some_text="Hello world"
echo $some_text

cat <<EOF | python -
import sys;
for r in range(3):
  print r
  for a in range(2):
    print "hello"
EOF

কপি করে প্রিন্ট:

0 
hello
hello
1
hello
hello
2
hello
hello

তবে শেল স্ক্রিপ্ট এবং পাইথন স্নিপেটের মধ্যে ভেরিয়েবলগুলি ভাগ করতে আমার বেশ কষ্ট হচ্ছে time

  1. আমি কীভাবে ব্যাশ স্ক্রিপ্টে পাইথন সাবস্ক্রিপ্টের আউটপুট সংগ্রহ করতে পারি? (যেমন একটি ভেরিয়েবল যেমন $output)।

  2. আমি কীভাবে $some_textপাইথন স্ক্রিপ্টে ব্যাশ ভেরিয়েবল (উদাহরণস্বরূপ ) পাস করতে পারি ?


1
আপনি python - <<EOFপরিবর্তে করতে পারেন ।

jftr imo এটি খারাপ স্টাইল এবং আপনার এড়াতে চেষ্টা করা উচিত
উলরিচ ড্যাঙ্গেল

1
কেন / zsh ট্যাগ?
স্টাফেন চেজেলাস

উত্তর:


12

পাইথনে ভেরিয়েবল পাওয়া

যেহেতু (যখন EOFচিহ্নিতকারীকে উদ্ধৃত করা হয়নি) পাঠ্য হেরডোক থেকে pythonমানক ইনপুটগুলিতে প্রেরণের আগে পরিবর্তনশীল প্রতিস্থাপন ঘটে , আপনি স্ক্রিপ্টের ডানদিকে পরিবর্তনশীলটি ফেলে দিতে পারেন।

python - <<EOF
some_text = "$some_text"
EOF

তাহলে some_textছিল test, পাইথন দেখতে হবে some_text = "test"। তবে এটি একটি কোড ইনজেকশন দুর্বলতা হিসাবে দেখা যেতে পারে তা নোট করুন। তাহলে some_textছিল "; import os; os.system("evil-command"); x = ", উদাহরণস্বরূপ, পাইথন দেখতে হবে:

some_text = ""; import os; os.system("evil-command"); x = ""

এবং সেই অশুভ আদেশটি চালাও।

আপনি যদি কোনও পাইরিঘা ছাড়াই আপনার পাইথন কোডটি সরাসরি স্ক্রিপ্টে টানতে সক্ষম হতে চান তবে আপনি আপনার পরিবর্তনশীলটি রফতানি করতে পারেন।

export some_text

এবং os.environএটি পুনরুদ্ধার করতে ব্যবহার করুন ।

some_text = os.environ['some_text']

এটি অনেক স্যানার / নিরাপদ পদ্ধতির।


পাইথন থেকে আউটপুট প্রাপ্ত

স্ক্রিপ্টের আউটপুট সংগ্রহ করতে আপনি কমান্ড বিকল্প ব্যবহার করতে পারেন।

output=$(
python - <<EOF
import sys;
for r in range(3):
  print r
  for a in range(2):
    print "hello"
EOF
)

(দ্রষ্টব্য যে সমস্ত নতুন লাইনের অক্ষর মুছে ফেলা হয়েছে)


এটি দুর্দান্ত দেখাচ্ছে। আপনি যখন বলেছিলেন "You could also pass the variable to the script as an argument", পাইথন স্ক্রিপ্টটি শেল স্ক্রিপ্টের মধ্যে এম্বেড করা আছে তা বিবেচনা করে আপনি কী করবেন?
আমিলিও ওয়াজকেজ-রেইনা

দুঃখিত, আমি এটি সম্পর্কে এক সেকেন্ডের জন্য ভুলে গিয়েছিলাম। আমি সেই সমাধানটি সরিয়েছি এবং আরও ভাল সমাধান যুক্ত করেছি।

আপনি কীভাবে বংশোদ্ভূত চিহ্নিতকারীটির নাম রাখছেন সে সম্পর্কে সতর্ক থাকুন। যখন এটি আপনার উদাহরণ হিসাবে অকেজো হয়েছে, শেল প্রসারণ হেরডোক স্ট্রিংয়ের মধ্যে ঘটবে। উদাহরণস্বরূপ, যদি আপনার অজগর কোডটি কেবলমাত্র সমন্বিত থাকে print '$SHELL'তবে আউটপুটটি যা হবে /bin/bashবা আপনার শেলটি যা ঘটবে তা হ'ল। আপনি যদি প্রথম লাইনটি পরিবর্তন করেন python - <<'END'তবে আউটপুট হবে $SHELL। আপনি যদি কোনও বাশ স্ক্রিপ্টে এম্বেড করার জন্য বিদ্যমান কোডটি অনুলিপি করে আটকে দিচ্ছেন, আপনি অবশ্যই শেল বিকল্পগুলি চান না - আপনি কোডটি ঠিক একইভাবে চালিত করতে চান যখন এটি কোনও ব্যাশ স্ক্রিপ্টে এম্বেড করা হয়নি, তাই না?
ক্রিস জনসন

8

আপনার পদ্ধতির সমস্যাটি হ'ল এমবেডড পাইথন স্ক্রিপ্টটির আর মূল স্টিডিনে অ্যাক্সেস নেই (যেহেতু এর স্টিডিনটি নিজেই ...)।

যদি এটি কোনও সমস্যা হয় তবে আপনি লিখতে পারেন:

python -c '
import sys;
for r in range(3):
  print r
  for a in range(2):
    print "hello"
'

বা পাইথন স্ক্রিপ্টে যদি একক উদ্ধৃতি থাকতে পারে:

python -c "$(cat << 'EOF'
import sys;
for r in range(3):
  print r
  for a in range(2):
    print "hello"
EOF
)"

বা:

python <(cat << 'EOF'
import sys;
for r in range(3):
  print r
  for a in range(2):
    print "hello"
EOF
)

6

ফাইলের নাম হিসাবে একটি ড্যাশ ব্যবহার করুন:

ruby - a b <<'END'
puts ARGV.join(",")
END

python - a b <<'END'
import sys
print ",".join(sys.argv[1:])
END

sys.argv[1:]পাইথনে এটি করার সঠিক উপায় কিনা তা আমি জানি না । -E / -c এর জন্য আপনি যুক্তিগুলির শেষটি এর সাথে নির্দিষ্ট করতে পারেন:

set -- -a -b -c
ruby -e 'puts ARGV.join(",")' -- "$@"
python -c 'import sys; print ",".join(sys.argv[2:])' -- "$@"

আউটপুট ক্যাপচার এবং STDERR পুনর্নির্দেশ:

x=$(ruby <<'END' 2> /dev/null
puts "a"
abort "b"
END
)

2

1) আপনি পাইথনের একটি ফাইলের ক্ষেত্রে ভেরিয়েবল অ্যাসাইনমেন্ট লিখতে এবং তারপরে আপনার বাশ স্ক্রিপ্টটিতে উত্স লিখতে পারেন।

2) যেহেতু আপনার শব্দ (ইওএফ) উদ্ধৃত হয়নি, তাই এখানে-নথির সমস্ত লাইন প্যারামিটার বিস্তারের শিকার হয়। পাইথন স্ক্রিপ্টে স্টাফ দেওয়ার জন্য আপনি এটি ব্যবহার করতে পারেন।

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