আমার বাশ স্ক্রিপ্টটি কীভাবে পরিচয় সনাক্ত করে না?


216

আমার ~/.bashrcফাইলে দুটি সংজ্ঞা থাকুন:

  1. commandA, যা দীর্ঘ পথের একটি উপাধি
  2. commandB, যা বাশ স্ক্রিপ্টের একটি উপনাম

আমি এই দুটি কমান্ড দিয়ে একই ফাইলটি প্রক্রিয়া করতে চাই, তাই আমি নিম্নলিখিত বাশ স্ক্রিপ্টটি লিখেছিলাম:


#!/bin/bash

for file in "$@"
    do
    commandA $file
    commandB $file
done

এমনকি আমার সেশন থেকে লগ আউট এবং আবার লগ ইন করার পরেও command not foundআমি যখন এই স্ক্রিপ্টটি চালিত করি তখন বাশ আমাকে উভয় কমান্ডের ত্রুটির সাথে অনুরোধ জানায় ।

আমি কি ভুল করছি?


10
বিটিডাব্লু, একটি উলেস সনাক্ত করার জন্য লগ ইন এবং আউট করার দরকার নেই। তোমার শুধু দরকার source ~/.bashrc
tshpang

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

একটি উপাধি কমান্ডকে ছোট করার একটি উপায়। (এগুলি কেবলমাত্র ইন্টারেক্টিভ শেলগুলিতে ব্যবহৃত হয় স্ক্রিপ্টগুলিতে নয় - এটি একটি স্ক্রিপ্ট এবং একটি ইন্টারেক্টিভ শেলের মধ্যে খুব কম পার্থক্যগুলির মধ্যে একটি))
ক্রিস রুফ

উত্তর:


117

প্রথমত, যেমন ডেমিমেকে বলেছিলেন, ডিফল্টরূপে এলিয়াসগুলি অ ইন্টারেক্টিভ শেলগুলিতে প্রসারিত হয় না।

দ্বিতীয়ত, .bashrcঅ-ইন্টারেক্টিভ শেলগুলি দ্বারা পাঠ করা হয় না যদি আপনি BASH_ENVপরিবেশের পরিবর্তনশীল সেট না করে।

তবে সবচেয়ে গুরুত্বপূর্ণ: এটি করবেন না! অনুগ্রহ? একদিন আপনি সেই স্ক্রিপ্টটি এমন কোনও জায়গায় নিয়ে যাবেন যেখানে প্রয়োজনীয় উপাত্তগুলি সেট করা নেই এবং এটি আবার ভেঙে যাবে।

পরিবর্তে আপনার স্ক্রিপ্টে শর্টকাট হিসাবে পরিবেশের ভেরিয়েবলগুলি সেট এবং ব্যবহার করুন:

#!/bin/bash

CMDA=/path/to/gizmo
CMDB=/path/to/huzzah.sh

for file in "$@"
do
    $CMDA "$file"
    $CMDB "$file"
done

5
এই সমাধানটি সাধারণ aliasব্যবহারের ক্ষেত্রে কার্যকর হয় না। যেমন alias mv="mv -v --backup=numbered"
Evi1M4chine

@ এভিআই এম এম 4 চাইন: হ্যাঁ, এটি হয়। অন্তত আমি গিলসকে অপ্রয়োজনীয় সম্পাদনা ফিরিয়ে দেওয়ার পরে। তবে প্যারামিটারগুলির জন্য যাইহোক, পৃথক ভেরিয়েবল ব্যবহার করা ভাল।

1
আহ, আশেপাশে উদ্ধৃতিগুলির অভাব নোট করুন $CMDA/ $CMDB… বড় হাতের অক্ষর বাদে ব্যাশ নিজেই বাশার জন্য সংরক্ষিত রয়েছে, এবং এটি সত্যই কার্যকর, কোটের অভাব আমাকে সত্যিই অস্থির করে তুলেছে… যাইহোক ধন্যবাদ।
Evi1M4chine

@ এভিআই এম এম চাইন: আহ, কি? 1. আমি নিজেকে সাম্প্রতিকতম সম্পাদনাতে উদ্ধৃতিগুলি সরিয়েছি। 2. আপনি "বাশ নিজেই সংরক্ষিত" কোথা থেকে পাবেন? এটিই আমি এই প্রথম শুনেছি। ৩. যদি এটি আপনাকে অস্বস্তি করে তোলে, তবে প্রথমে ব্যাশ ব্যবহার সম্পর্কে আপনি কেমন অনুভব করবেন? যাই হোক না কেন, বিকল্পগুলির জন্য পৃথক ভেরিয়েবল ব্যবহার করুন যেমনটি আমি আপনাকে বলেছি

1
@ আলভাস: অনুমানটি হ'ল gizmoসেই পথে নয় বা একই নামে একটি আদেশ রয়েছে তবে উচ্চতর অগ্রাধিকার রয়েছে। অন্যথায় আপনি CMDAসরল gizmoপ্রথম স্থানে সেট করতে পারে ।

161

যদি আপনি বাশ ম্যানপেজটি সন্ধান করেন তবে আপনি পাবেন:

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

সুতরাং একটি রাখা

shopt -s expand_aliases

আপনার স্ক্রিপ্টে

আপনার স্ক্রিপ্ট এ সেট করার পরে আপনার এলিয়াস ফাইল উত্স নিশ্চিত করুন।

shopt -s expand_aliases
source ~/.bash_aliases

7
আমি এটি আমার স্ক্রিপ্টে রেখেছি, তবে এটি এখনও কাজ করছে না। একই ত্রুটি।
জায়েদ

5
যুক্ত করা shopt -s expand_aliases source ~/.bash_aliasesআমার জন্য পুরোপুরি কাজ করে। প্রায়শই এই জাতীয় .bashrc এ ইন্টারেক্টিভ শেল সনাক্তকরণের একটি ফর্ম থাকে: # If not running interactively, don't do anything [ -z "$PS1" ] && return@ জাইদ, সম্ভবত আপনি যে ফাইলটি সোর্স করেছেন তাতে এটি পরীক্ষা করতে চান।
ফ্র্যাঙ্ক শুবার্ট

1
চমৎকার! আমার স্ক্রিপ্ট সংরক্ষণ! :) টার্মিনালে তথ্য এবং মানচিত্রগুলি পড়ার / অনুসন্ধান করা / ব্রাউজ করা এতই কঠিন যে আমি খুব আগেই ছেড়ে দিয়েছিলাম এবং ইন্টারনেটে অনুসন্ধানে যেতে পারি ...
কুম্ভ শক্তি

2
কৌতূহলজনকভাবে, shopt -s expand_aliasesওরফে সংজ্ঞার আগে যেতে হবে না তবে ওরফে ব্যবহারের আগে। @ ফ্র্যাঙ্কস্কুবার্টে যুক্ত করা: ইন্টারেক্টিভ শেল সনাক্তকরণটি শেলটির $-বিকল্পগুলির মধ্যে রয়েছে এমনটি ব্যবহার করেও করা যেতে পারে , বিশেষত iশেলটি ইন্টারেক্টিভ থাকলে।
বৈধ

2
এটি একটি সঠিক উত্তর নয় ... আপনার স্ক্রিপ্টের মধ্যে আপনার এলিয়াসগুলি সরবরাহ করা উত্তর নয়। আপনার ~/.bash_aliasesইন্টারেক্টিভ শেলের উপর পূর্বে লোড হওয়া অন্যান্য স্টাফগুলির উপর নির্ভর করতে পারে ... আমি যে নিকটতম জিনিসটি পেয়েছি তা হ্যাশব্যাংকে #!/bin/bash -liএখনও সম্পূর্ণ নিখুঁতভাবে পরিবর্তন করা হচ্ছে । আদর্শভাবে আপনার ফাংশন ব্যবহার করা উচিত এবং উপকরণগুলি নয়।
স্টিফানোস কালান্টজিস

44

উপনামগুলি রফতানি করা যায় না যাতে শেল স্ক্রিপ্টগুলিতে সেগুলি সংজ্ঞায়িত করা যায় না তে সেগুলি উপলভ্য নয়। অন্য কথায়, আপনি যদি এগুলি সংজ্ঞায়িত করেন তবে সেগুলি ~/.bashrcউপলভ্য নয় your_script.sh(যদি আপনি ~/.bashrcস্ক্রিপ্টে উত্স না দেন, যা আমি সুপারিশ করব না তবে এটি সঠিকভাবে করার উপায় রয়েছে)।

তবে, ফাংশনগুলি রফতানি করা যেতে পারে এবং শেল স্ক্রিপ্টগুলিতে উপলব্ধ হবে যেগুলি এমন পরিবেশ থেকে চালিত হয় যেখানে তারা সংজ্ঞায়িত হয়। এটি আপনার বাশারকে রেখে এটি করা যেতে পারে:

foo বিন্যাস ()
{
    প্রতিধ্বনি "হ্যালো ওয়ার্ল্ড!"
}
এক্সপোর্ট - foo

যেমন বাশ ম্যানুয়ালটিতে বলা হয়েছে, "প্রায় প্রতিটি কাজের জন্য শেল ফাংশনগুলি এলিয়াসের চেয়ে বেশি পছন্দ করা হয়।"


1
এই টেকনিক্যালি প্রশ্নের উত্তর নয়, যেমন আপনি বলতে আপনি কেবল প্রতিস্থাপন করতে পারেন alias commandA=...সঙ্গে commandA() { ... }তারপর export commandAএবং আপনি ওরফে অভিন্ন আচরণ পেতে। সুতরাং এটি যতদূর আমি জানি যে ব্যাশ স্ক্রিপ্টগুলিতে দুর্দান্ত কাজ করে
উপাধির

এখানে সমস্যাটি যখন আপনার একটি উপনামের প্রয়োজন হয় যা আপনি প্রচুর উদ্ধৃত বিকল্পগুলি দিয়ে যান। উদাহরণস্বরূপ উদাহরণস্বরূপ, alias b=bashএটি করা সহজ করে b -c "echo test | grep test"যা কার্যগুলিতে করা কঠিন।
এফএমস্ট্রেট

@ এফএমস্ট্র্যাট: b () { bash "$@"; }তারপরেb -c "echo test | grep test"
ডেনিস উইলিয়ামসন

11
[cmd line] > bash -i [your script's file path]

iইন্টারেক্টিভ জন্য এবং আপনার সূত্র bashতোমার জন্য প্রোফাইল।


-5

আমি মাঝে মাঝে খুঁজে পেয়েছি বাশ স্ক্রিপ্টটি রফতাকেও স্বীকৃতি দেয় না। তবে এটিতে পরিবর্তন করা হচ্ছে

#!/bin/sh

আমার জন্য কাজ কর.


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