বাশ: একটি ভেরিয়েবলের একটি উপনাম ব্যবহার করুন


9

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

সমস্যা (আমি ধরে নিই) এটি হ'ল ভেরিয়েবলের আগে উপাধিগুলি প্রসারিত হয়। কোনও ভেরিয়েবল থেকে এলিয়াস চালানোর কোনও উপায় আছে কি?

নমুনা লিপি:

#!/bin/bash
# File: runall

shopt -s expand_aliases
source ~/.aliases

while (( "$#" )); do
    $1
    shift
done

runall "echo test"কাজ করে, কিন্তু runall "myalias"দেয়runall: line 8: myalias: command not found

উত্তর:


9

কিছু পরীক্ষার পরে, আমি নিম্নলিখিতটি শেষ করেছি:

  • উপনামগুলি কেবল ইন্টারেক্টিভ মোডে কাজ করে ( -iশেবাংয়ে যোগ করুন )।
  • এলিয়াসগুলি কোনও ব্যাখ্যাযুক্ত উত্স থেকে এলে মূল্যায়ন করা হয় না (এই ক্ষেত্রে, পরিবর্তনশীল)।
  • আপনি এর সাথে উলাম ব্যবহার করতে বাশ পেতে পারেন eval $1। নোট করুন যে evalকোনও ভেরিয়েবলের সাহায্যে তৈরি করা কোনও কিছু বিপজ্জনক, তবে যেহেতু স্ক্রিপ্টের পুরো বিন্দুটিতে স্বেচ্ছাসেবী কার্যকর করা দরকার, আমি এগুলি থেকে খুব বেশি কিছু করব না।

বাশ ম্যান পৃষ্ঠা থেকে:

শেলটি ইন্টারেক্টিভ না হলে অ্যালিয়াসগুলি প্রসারিত হয় না, যদি না শপ বিকল্পটি প্রসারিত_লিয়াস শেল বিকল্পটি সেট করা না হয় (নীচে শেল বিল্টিন কম্যান্ডের অধীনে শপটের বর্ণনা দেখুন)।

সুতরাং আপনি shopt -s expand_aliasesপরিবর্তে যোগ করতে পারে -i

এছাড়াও,

কমান্ড পড়ার সময় উপাধিগুলি প্রসারিত হয়, যখন তা কার্যকর করা হয় না।

যেহেতু কমান্ডটি পড়ার আগে ভেরিয়েবলগুলি প্রসারিত করা হয় না, তাই উপন্যাসটি ব্যবহার করে সেগুলি আরও বাড়ানো হবে না।


1
জেনে ভালো লাগল. কৌতূহলের বাইরে: evalভেরিয়েবলগুলির পক্ষে এটি কেন বিপজ্জনক ?

1
@ এই বিবেচনা করুন eval "echo $1"। বলি আমি ফোন করি ./script.sh "hello;rm -rf ~। কী মৃত্যুদন্ড কার্যকর করা হয়? echo hello, অনুসরণ করে rm -rf ~। স্পষ্টতই এটি একটি স্বতন্ত্র উদাহরণ, তবে নীতিটি ধারণ করে।
কেভিন

কাজের evalসামনে যোগ করা $1, যেহেতু আমার ইতিমধ্যে ছিল shopt -s expand_aliases। ধন্যবাদ!
জেইসন

1

আমার একইরকম সমস্যা ছিল এবং এই সাইটের উপর বর্ণিত যেমন আমার পক্ষে কাজ করেছিল আমার প্রাক্তন নামগুলিকে ফাংশনে পরিণত করে আমার সমস্যা সমাধান করতে সক্ষম হয়েছি।

যেমন

alias lsd="ls -lash"

প্রতি

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