একটি bash শেল স্ক্রিপ্টে কমান্ডগুলি কিভাবে প্রতিস্থাপন করবেন, কিন্তু তাদের কার্যকর করবেন না?


8

কমান্ড প্রতিচ্ছবি সহ একটি শেল স্ক্রিপ্ট চালানোর জন্য একটি উপায় আছে কিন্তু w / o আসলে তাদের নির্বাহ?

চলুন বলি যে আমার স্ক্রিপ্ট একটি ফাইল মুছে ফেলছে যার নামের একটি পরিবর্তনশীলে সংরক্ষিত আছে:

#!/bin/bash
set -v
FN="filename"
rm -f ${FN}

যোগ করার পদ্ধতি set -v execution এর আগে নিম্নলিখিত কমান্ড ইকো করবে:

$ ./scr.sh
FN="filename"
rm -f ${FN}

এখন, আমি এই স্ক্রিপ্টের প্রবাহটি দেখতে চাই / আসলে ফাইলটি মুছে ফেলছি। হ্যাঁ, আমি বহিরাগত পরিবেশ এবং ফাইল সিস্টেমের উপর কোনো প্রভাব প্রতিরোধ করতে চাই। এটা কি সম্ভব?

আমি একটি সঙ্গে সব কমান্ড মোড়ানো পারে echo কমান্ড, কিন্তু এটি একটি দীর্ঘ স্ক্রিপ্ট জন্য ক্লান্তিকর।


আমি একটি ব্যাশ-স্ক্রিপ্টিং বিশেষজ্ঞ নই, কিন্তু যদি আমি অন্য প্রোগ্রামিং ভাষা দিয়ে এটি লিখি, আমি একটি অ্যারে সমস্ত কমান্ড সংরক্ষণ করব। এই ভাবে এটি লুপের মাধ্যমে সহজ এবং কমান্ডটি চালানো বা মুদ্রণ করা সহজ হওয়া উচিত।
hugo der hungrige

উত্তর:


7

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

যদি পয়েন্টটি হয় যে আপনি একটি স্ক্রিপ্টটি পরীক্ষা করতে চান এবং এটি চালানোর আগে এটি কী করে তা জানেন তবে এটি একটি খারাপ ধারণা নয়। কিন্তু প্রকৃতপক্ষে, এটি করার সর্বোত্তম উপায়টি কেবলমাত্র ফাইলটি ব্রাউজ করে less অথবা vi অথবা অনুরূপ কিছু।

যোগ করা হয়েছে

যদি আপনি একটি স্ক্রিপ্ট তৈরি করেন এবং আপনি প্রথমবার এটির মাধ্যমে পদক্ষেপ নিতে চান তবে যুক্তিটি পরীক্ষা করে দেখুন কিন্তু যদি আপনার কোনও ত্রুটি না থাকে তবে আসলে কোনও ক্ষতি হয় না, সমাধানটি আমি প্রায়ই ব্যবহার করতে সক্ষম হচ্ছি শুধুমাত্র পরিবর্তন করতে একটি pasting দ্বারা কোনো ক্ষতি করতে পারে যে বিবৃতি echo সামনের দিকে।

এটি প্রায়শই বাস্তব বাস্তব-জীবনের স্ক্রিপ্টগুলিতে কাজ করে কারণ (ক) আপনি যে আইটেমগুলির উপর পুনরাবৃত্তি করবেন তার তালিকাগুলি তৈরি করা হয় বা আপনি কোনও পরিবর্তনশীল সেট করবেন তার মানটি প্রায়ই ফাইল সিস্টেম পরিবর্তন না করেই তৈরি করা যেতে পারে এবং (খ) এটি সাধারণত যথেষ্ট অনুমান করুন যে আপনি যদি কমান্ডটি চালান তবে এটি সফল হবে।


ধন্যবাদ। কোনও উপায় থাকলে আমাকে অবাক করে দেবে, ঠিক যে কারণে আপনি উল্লেখ করেছেন তার কারণেই, তবে আমি তা করার চেষ্টা করেছি। এর কারণ হল আমি একটি স্ক্রিপ্ট তৈরি করছি যা একটি নেটওয়ার্কের মধ্যে অনেক মেশিনে ফাইল চালায় এবং রিমোট হোস্টগুলিতে কিছু কাজ করে। আসলে ফাইল সিস্টেমগুলিতে পরিবর্তনগুলি করার আগে আমি স্ক্রিপ্টের প্রবাহ দেখতে চাই। ফাইল ত্রুটিগুলি সংশোধন করার জন্য এটি সমস্ত দূরবর্তী মেশিনে যাওয়ার মতো ক্লান্তিকর হবে ...
ysap

1
একটি সংযোজন: স্ক্রিপ্টের মাধ্যমে পদক্ষেপ নিতে, আপনি স্ক্রিপ্টটি শুরু করতে পারেন trap read debug যা প্রতিটি এক্সিকিউটেড লাইনের পরে একটি পঠন করবে এবং আপনি তারপরে ধীরে ধীরে এটি দিয়ে ধাপে ধাপে ধাপে যেতে পারবেন (যদি আপনার কাছে সত্যিই দীর্ঘ স্ক্রিপ্ট থাকে এবং এটি প্রথমবার পরীক্ষা করতে চান তবে এটি উপকারী হবে)।
netigger

6

আমি মনে করি আপনি echo করতে যাচ্ছেন - তবে যদি আপনি একটি পরিবর্তনশীল কমান্ডটি রাখেন তবে আপনি এটি চালু এবং বন্ধ করতে পারেন। এছাড়াও, কমান্ড একটি ফাংশন এবং আপনি চান হিসাবে পরিশীলিত হতে পারে।

#!/bin/bash
echo 'Debug'
  D=echo
  :>| testy
  ls -l testy
  $D rm -f testy
  ls -l testy
echo $'\n\nLive'
  D=
  :>| testy
  ls -l testy
  $D rm -f testy
  ls -l testy

!$ > ./conditional.sh
Debug
-rw-rw-r-- 1 nobody nobody 0 2013-01-18 15:28 testy
rm -f testy
-rw-rw-r-- 1 nobody nobody 0 2013-01-18 15:28 testy

লাইভ -আরওয়াই-রউ-র-- 1 কেউ কেউ 001-01-18 15:28 testy ls: testy অ্যাক্সেস করতে পারবেন না: কোন ফাইল বা ডিরেক্টরি নেই


আমি ইকো / don't-echo কমান্ডগুলিতে উদ্ধৃতি প্রয়োজন, এবং তারপর ব্যবহার করতে হয়েছিল D=eval লাইভ অংশে। কিন্তু চমৎকার উত্তর!
Jasper

4

আপনি bash- -x বিকল্পটি ব্যবহার করে প্রবাহটি ট্রেস করুন, তবে এটি এখনও কমান্ডগুলি কার্যকর করবে।

আপনি যা করতে পারেন সেটি হল প্রতিমাসংক্রান্ত ইকোটি বা Rm এর মত বাহ্যিক প্রভাবগুলির কমান্ডগুলি মন্তব্য করা। অন্তত আপনি প্রতিটি লাইন পরিবর্তন করতে হবে না।


ধন্যবাদ। আমি আমার প্রশ্নের যে বিকল্প উল্লিখিত, কিন্তু এটা সত্যিই আমার সমস্যা সমাধান না।
ysap

দুঃখিত, আমি ভেবেছিলাম আপনি প্রতিটি লাইন প্রতিচ্ছবি করতে চাইছেন, -x এটি কয়েকটি কমান্ডে হ্রাস করবে এবং আপনাকে মূল্যায়ন দেখাবে।
parkydr

2

করা set –n, অথবা যোগ করুন n আপনার বিদ্যমান set –v কমান্ড। কিন্তু যেহেতু শেলটি কোনও কমান্ডের মূল্যায়ন করতে পারে না, এমনকি তাও নয় if অথবা while, আপনি অপারেশন প্রবাহ সম্পর্কে খুব ভাল দেখতে পাবেন না।


ধন্যবাদ। এটি একটি ভাল শুরু, কিন্তু আপনি যেমন উল্লেখ করেছেন, এটি আমাকে প্রকৃত প্রবাহ দেখতে দেয় না - যেখানে আমার আসল স্ক্রিপ্টে রিমোট হোস্টগুলির তালিকাতে আমার লুপ থাকে।
ysap

2

আমি শুষ্ক চালানোর জন্য কোন নির্দিষ্ট পদ্ধতি জানি না, তবে আমরা একটি অজানা স্ক্রিপ্ট বোঝার জন্য কিছু সতর্কতা ব্যবহার করতে পারি।

  1. ব্যবহার করা chroot আপনার ডিবাগ স্ক্রিপ্ট চালানোর পরিবেশ। এটি একটি স্যান্ডবক্স হিসাবে কাজ করবে এবং প্রধান সিস্টেম ফাইল মুছে ফেলার / সংশোধন করার জন্য সুরক্ষা প্রদান করবে।
  2. ব্যবহার bash -n <script> জন্য সিনট্যাক্স চেক । Gnu bash ম্যানুয়াল থেকে https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html

-n Read commands but do not execute them; this may be used to check a script for syntax errors. This option is ignored by interactive shells.

  1. অন্তত একবার স্ক্রিপ্ট পড়ুন। আপনি করতে পারেন ডিবাগ জন্য echo বিবৃতি ব্যবহার করুন হিসাবে উল্লিখিত ব্যবহারকারী 191016 দ্বারা উত্তর
    • সন্দেহজনক বা বিপদ প্রবণ কোড জন্য সন্ধান করুন।
    • উদাহরণস্বরূপ আরএম সম্পর্কিত, কমান্ড / dev / sda ইত্যাদি কমান্ড।
  2. সর্বদা স্বাভাবিক ব্যবহারকারী হিসাবে স্ক্রিপ্ট চালানোর চেষ্টা করুন, রুট হিসাবে অজানা স্ক্রিপ্ট চলতে এড়াতে।
  3. আপনি করতে পারেন উল্লিখিত সংজ্ঞা কমান্ড তৈরি করতে যা আপনার স্ক্রিপ্টের শুরুতে ইন্টারেক্টিভ হিসাবে ফাইল সংশোধন করতে পারে উদাহরণ alias rm="rm -i" alias cp="cp -i" alias mv="mv -i" Sed মত স্ট্রিম সম্পাদকদের জন্য sed -i (-i পরিবর্তে ফাইলটি সংশোধন করে -i এটি sed এর জন্য একটি শুষ্ক চালনা করে, বিস্তারিত জানার জন্য ম্যান পৃষ্ঠা দেখুন) আপনি সম্পূর্ণ কমান্ড কপি এবং রান করতে পারেন। এটি প্রকৃত কমান্ডের ঠিক আগে পর্দায় আউটপুট প্রদর্শন করবে এবং ব্যবহারকারীর ইনপুট চালিয়ে যাওয়ার জন্য অপেক্ষা করতে কমান্ডটি ব্যবহার করবে। উদাহরণ sed -i <pattern> সঙ্গে এটি প্রতিস্থাপন করুন sed <pattern> read -p "Press any key..." sed -i <pattern>

এছাড়াও আপনার সিস্টেমে ব্যাকআপ পয়েন্টগুলি রাখা সবসময় সুপারিশ করা হয় যাতে জরুরি তথ্য পুনরুদ্ধার করা যায়।


1

আপনি যদি পরিবর্তনগুলি এড়াতে চান তবে আপনি স্ক্রিপ্টটিকে ব্যবহারকারীর সুবিধা ছাড়াই চালাতে পারেন:

sudo -u nobody ./scr.sh

আপনার উদাহরণে, এই চালানো হবে FN="filename" সচরাচর. এটি টেকনিক্যালি কমান্ড সঞ্চালিত হয় rm -f ${FN} পাশাপাশি কিছুই হবে না কেউ কিছু ফাইল মুছে ফেলার জন্য প্রয়োজনীয় অনুমতি নেই।

অবশ্যই, এই শর্তাধীন কর্মপ্রবাহ সঙ্গে সমস্যা হবে। আসলে যে rm কমান্ড ব্যর্থ স্ক্রিপ্ট আরও অংশ প্রভাবিত হতে পারে।


যেসব বিষয় আমরা কখনও বুঝতে পারব না: কেন রুটকে কেউ চালানোর দরকার নেই ...
mjohnsonengr

ব্যবহারকারী "কেউ" OS এর জন্য বিশেষ নয়, তবে আপনি যে কোনওর জন্য পাসওয়ার্ডহীন সুডোকে সুডোর ফাইলের মধ্যে একটি এন্ট্রি যুক্ত করতে পারেন।
Dennis

আমি জানিনা. মনে হচ্ছে যে স্ক্রিপ্টটি শেষ হওয়ার আগে কিছু ত্রুটি বা অন্য কারন শেষ হয়ে যাবে।
Edward Falk

1

এখানে আমি ব্যবহার করতে চাই একটু গঠন:

#!/bin/sh

verbose=false
really=true

# parse arguments
while [ $# -ge 1 ]
do
  case "$1" in
    -v) verbose=true ;;
    -n) really=false; verbose=true ;;
  esac
  shift
done

doCmd() {
  if $verbose; then echo "$@"; fi
  if $really; then "$@"; fi
}

doCmd make foo
doCmd rm -rf /tmp/installdir
doCmd mkdir /tmp/installdir
doCmd whatever
doCmd blah blah
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.