শেল স্ক্রিপ্টে একটি উপনাম কীভাবে চালানো যায়?


101

আমার কাছে একটি এক্সিকিউটেবল ফাইল রয়েছে mpiexec, যার পুরো পথ ~/petsc-3.2-p6/petsc-arch/bin/mpiexec। যেহেতু আমি এই নির্দেশটি বিভিন্ন ডিরেক্টরিতে চালিত করতে চাই (পুরো পথটি পুনরায় টাইপ না করে), তাই আমি আমার হোম .bashrcফাইলে একটি উপাধি সেটআপ করি :

alias petsc="~/petsc-3.2-p6/petsc-arch/bin/mpiexec"  

যা আমাকে mpiexecটাইপ করে সহজেই কমান্ড প্রম্পটে এই ফাইলটি সম্পাদন করতে দেয় :

petsc myexecutable

আমি কমান্ড হিসাবে scriptআমার নতুন উপন্যাসটি ব্যবহার করে নামকরণ করা একটি শেল স্ক্রিপ্ট ফাইল লেখার চেষ্টা করেছি petsc। আমার শেল স্ক্রিপ্টটিকে যথাযথ অনুমতি দেওয়ার পরে (ব্যবহার করে chmod), আমি স্ক্রিপ্টটি চালানোর চেষ্টা করেছি। তবে এটি আমাকে নিম্নলিখিত ত্রুটি দিয়েছে:

./script: line 1: petsc: command not found

আমি জানি যে আমি কেবল mpiexecফাইলের পুরো পথটি লিখতে পারি , তবে প্রতিবারই আমি একটি নতুন স্ক্রিপ্ট লিখতে চাইলে পুরো পথটি লিখতে অসুবিধা হয়। petscস্ক্রিপ্ট ফাইলের অভ্যন্তরে আমার উপনামটি ব্যবহার করার কোনও উপায় আছে কি ? আমি কীভাবে আমার সম্পাদনা করতে পারি .bashrcবা .bash_profileএটি ঘটানোর কোনও উপায় আছে ?


কীভাবে উপনাম যুক্ত করবেন .bash_aliases? এছাড়াও আপেক্ষিক পাথের পরিবর্তে নিখুঁত পথটিকে কীভাবে উপস্থাপন করবেনalias petsc='/home/user/petsc-3.2-p6/petsc-arch/bin/mpiexec'
নীতিন ভেঙ্কটেশ

@ নাইটস্টর্ম: কোনও সমাধানই কার্যকর বলে মনে হচ্ছে না ... আমি এখনও আগের মতো ত্রুটি পেয়েছি
পল

উত্তর:


74
  1. আপনার শেল স্ক্রিপ্টে পুরো পথটি ব্যবহার করুন তার পরিবর্তে একটি উপনাম।

  2. আপনার শেল স্ক্রিপ্টে, একটি পরিবর্তনশীল, পৃথক সিনট্যাক্স সেট করুন

    petsc='/home/your_user/petsc-3.2-p6/petsc-arch/bin/mpiexec'
    
    $petsc myexecutable
  3. আপনার স্ক্রিপ্টে একটি ফাংশন ব্যবহার করুন। petscজটিল হলে সম্ভবত আরও ভাল

    function petsc () {
        command 1
        command 2
    }
    
    petsc myexecutable
  4. আপনার উপনাম উত্স

    shopt -s expand_aliases
    source /home/your_user/.bashrc

আপনি সম্ভবত আপনার উত্সটি তৈরি করতে চান না .bashrc, সুতরাং, আইএমও, প্রথম 3 এর মধ্যে একটির চেয়ে ভাল।


15
পয়েন্ট 4 কাজ করবে না, যদি না আপনি shopt -s expand_aliasesএকই স্ক্রিপ্টে ব্যবহার করেন।
এনজোটিব

আপনার পরামর্শ 2) কাজ করে, তবে আমি প্রথম লাইন পেটস্ক = "..." না লিখে একাধিক শেল স্ক্রিপ্টগুলিতে একই কমান্ডটি ব্যবহার করতে সক্ষম হতে চাই। এই কাজ করতে একটি উপায় আছে কি?
পল

1
@ এঞ্জোটিব - আপনাকে ধন্যবাদ, আমি আমার উত্তরে এটি যুক্ত করেছি।
প্যান্থার

1
পয়েন্ট 2-এ আপনি একটি এলিফের পরিবর্তে একটি ভেরিয়েবল সেট করবেন না।
পাবউক

1
ওপি দ্বারা জিজ্ঞাসা করা হয়নি তবে প্রশ্নের শিরোনামের সাথে প্রাসঙ্গিক: পয়েন্ট 2 কমান্ড সম্বলিত কাজ করবে না |। এখানে, shopt -s expand_aliases& স্থানীয় উপনাম ব্যবহার করুন, যেমন alias myalias='echo abc|rev'- ব্যবহারের আগে লাইন-ব্রেক দরকার (ALIASES এ দেখুন man bash)। পয়েন্ট 4: উত্সযুক্ত ফাইল অ-ইন্টারেক্টিভ সম্পাদনকে আটকাতে পারে, যেমন কোনও স্ক্রিপ্টে। গোড়ার দিকে দেখুন exitবা return, যেমন [ -z "$PS1" ] && return(চেক যদি এর প্রাথমিক প্রম্পট নন-ইন্টারেক্টিভ শেল ইঙ্গিত সেট না করা হয়) অথবা জন্য একটি চেক হতে পারে iমধ্যে $-( $-শেল অপশন রয়েছে, iইন্টারেক্টিভ মানে)। man bashসেই পরিবর্তনশীলগুলির জন্য দেখুন ।
বৈধ

60

উপনামগুলি শেল ফাংশনের পক্ষে অবচিত হয়। থেকে bashম্যানুয়াল পৃষ্ঠা:

For almost every purpose, aliases are superseded by shell functions.

একটি ফাংশন তৈরি করতে এবং এটি সাব-শেলগুলিতে রফতানি করতে আপনার নীচে এইগুলি রাখুন ~/.bashrc:

petsc() {
    ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "$@"
}
export -f petsc

তারপরে আপনি আপনার স্ক্রিপ্টগুলি থেকে মুক্তভাবে আপনার আদেশটি কল করতে পারেন।


এটি প্রায় কাজ করে ... একমাত্র সমস্যা হ'ল আমাকে এক্সিকিউটেবল "এমপিএক্সেক" এর কাছে বিভিন্ন পতাকা পাঠাতে সক্ষম হতে হবে ... উদাহরণস্বরূপ, "পেরেস্ক-এন 40 মাইক্রিভেটেবল" এর মতো কিছু সম্পাদন করতে সক্ষম হওয়া দরকার ওরফে "পেটস্ক"
পল

4
@ পল: আমি "$@"যুক্তিগুলি পরিচালনা করতে কেবল যুক্ত করেছি ।
enzotib

12

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

  • (যদি আপনি এর mpiexecপরিবর্তে ব্যবহার করতে বিরক্ত না করেন petsc) $HOME/petsc-3.2-p6/petsc-arch/binআপনার PATHপরিবর্তনশীলটিতে যুক্ত করুন। এটি সম্পাদনা ~/.profileএবং সংযোজন দ্বারা করা যেতে পারে :

    PATH="$HOME/petsc-3.2-p6/petsc-arch/bin:$PATH"

    এই পরিবর্তনগুলি প্রয়োগ করতে পুনরায় লগইন করুন

  • ডিরেক্টরি তৈরি করুন ~/binএবং

    • petscধারণকারী একটি মোড়ক স্ক্রিপ্ট তৈরি করুন :

      #!/bin/sh
      exec ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "$@"
    • যদি প্রোগ্রামটি এর জন্য অনুমতি দেয় তবে আপনি শেলসক্রিপ্টটি এড়িয়ে যেতে পারেন এবং কমান্ডটি ব্যবহার করে একটি সিমিলিংক তৈরি করতে পারেন:

      ln -s ~/petsc-3.2-p6/petsc-arch/bin/mpiexec ~/bin/petsc

9

ব্যাশ 4 আপনি বিশেষ পরিবর্তনশীল ব্যবহার করতে পারেন: $BASH_ALIASES

উদাহরণ স্বরূপ:

$ alias foo="echo test"
$ echo ${BASH_ALIASES[foo]}
echo test
$ echo `${BASH_ALIASES[foo]}` bar
test bar

বিকল্প হিসাবে পরিবর্তনশীল হিসাবে সংজ্ঞায়িত করুন তারপর কমান্ড প্রতিস্থাপন ব্যবহার করুন বা eval

সুতরাং উদাহরণস্বরূপ, পরিবর্তে উপনামটি সংজ্ঞায়িত করার পরিবর্তে যেমন:

alias foo="echo test"

এটি হিসাবে সংজ্ঞায়িত করুন:

foo="echo test"

পরিবর্তে. তারপরে এটি দ্বারা কার্যকর করুন:

find . -type f -exec sh -c "eval $foo" \;

বা:

find . -type f -exec sh -c "echo `$foo`" \;

শট ক্রিয়াকলাপের পক্ষে যথেষ্ট পরিমাণে এলিয়াস হ্রাস করা হয়, এই উত্তরটি কেবলমাত্র একমাত্র যা গ্রহণ করা উচিত। এমনকি পুরাতন ডেবিয়ান 8 এর বাশ সংস্করণ 4 রয়েছে, তাই এটি ${BASH_ALIASES[alias]}একটি দুর্দান্ত বিকল্প। অন্যথায় আমাকে অন্যান্য জিনিস প্রয়োগ করতে আমার .বাশ_লিয়াসের অনেকগুলি লাইন সম্পাদনা করতে হয়েছিল। ধন্যবাদ.
erm3nda

7

আপনি বাশকে -i পতাকা সহ একটি ইন্টারেক্টিভ শেল হিসাবে আপনার স্ক্রিপ্টটি কার্যকর করতে বাধ্য করতে পারেন। এটি আপনার .bashrc ফাইলকে এলিয়াস এবং অন্যান্য ফাংশন সংজ্ঞায়িত করতে বলবে ।

উদাহরণ:

~ $ grep ll .bashrc
alias ll='ls -lah'
~ $ cat script.sh 
#!/bin/sh

ll
~ $ bash script.sh 
script.sh: line 3: ll: command not found
~ $ bash -i script.sh
..directory contents..

অধিক তথ্য:

$ man bash

2
.bashrcঅ-ইন্টারেক্টিভ এসএসএইচ কমান্ড কার্যকর করার সময়ও এটি পড়তে হবে (এজন্য এটি শীর্ষে ইন্টারঅ্যাক্টিভিটির জন্য একটি চেক আছে)
মুরু

6
ALIASES
   ...
   Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt (see the description of shopt under SHELL BUILTIN COMMANDS
   below).

সুতরাং এই প্রশ্নের আসল উত্তর, যারা তাদের বিকল্পের পরিবর্তে শেল স্ক্রিপ্টগুলিতে প্রকৃত উপকরণ ব্যবহার করতে চান তাদের জন্য:

#!/bin/bash

shopt -s expand_aliases

alias foo=bar

foo whatever

হিসাবে কেন আমি এই কাজ করতে চাই চাই: অস্বাভাবিক পরিস্থিতিতে কারণে আমি চিন্তা এটি একটি শেল স্ক্রিপ্টের মধ্যে একটি Dockerfile রত করা প্রয়োজন।


4
  1. ইন .bash_aliases:

    petsc {
    ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "$@"
    }

    অথবা ফাংশনটি ভিতরে রাখুন .bashrc। সাধারণত .bashrcশুধুমাত্র কনফিগারেশন সেটিংস bashসংরক্ষণ করা হয়।

  2. টার্মিনালে: source .bash_aliases

  3. ডাকা: petsc arg(s)

সুবিধা: আপনি প্রয়োজন নেই export -f petscযে .bash_aliases। উপনামগুলি হ্রাস করা হয়েছে তবে .bash_aliasesফাংশনগুলির জন্য ব্যবহার করা ঠিক আছে।


আমি এই সমাধানটি পছন্দ করি, পরে এটি দিয়ে চেষ্টা করব
গ্রিননলাইন

2
  1. আপনার শেল স্ক্রিপ্টে আপনার এলিয়াস ব্যবহার করুন।
  2. আপনার স্ক্রিপ্টটি আপনার বর্তমান, ইন্টারেক্টিভ শেল এটিকে সম্পাদন করার পরিবর্তে উত্স করুন।

সুতরাং আপনার যদি script.shআপনার কমান্ডগুলির সাথে একটি ফাইল ডাকা হয় যাতে এতে এলিয়াস ব্যবহার অন্তর্ভুক্ত থাকে তবে কেবল টাইপ করুন:

source script.sh

@ ডেভিডফোস্টার এই পদ্ধতিটি ভাল কাজ করে। .বা sourceবুলেটিনের সাথে স্ক্রিপ্ট উত্সাহিত করার ফলে বর্তমান শেলটি এতে সমস্ত কমান্ড কার্যকর করে। ওরফে সম্প্রসারণ শেল যা ঘটতে দয়া করে .বা sourceচালানো হয়, এটা ঘটে। তবে, এটি উপলব্ধি করা জরুরী যে এই পদ্ধতিটি কেবল কখনও কখনও কার্যকর because সাধারণ উপায়ে মৃত্যুদন্ড কার্যকর করার অভিপ্রায় লিখিত শেল স্ক্রিপ্টগুলি সাধারণত পরিবর্তে উত্সাহিত করা উচিত নয় - এগুলি প্রায়শই সঠিকভাবে কাজ করে না।
এলিয়াহ কাগন

@ এলিয়াকাগান: ধন্যবাদ উত্তরটি বোঝার অর্থ কী তা এখন আমি বুঝতে পেরেছি। আমি একটি ব্যাখ্যা যুক্ত করব।
ডেভিড ফোস্টারস্টার

1

(সম্পাদনা: এমপিএক্সেকের কলিংয়ের ভুল পড়া থেকে যেহেতু মুছে ফেলা হয়েছে)

আপনার যদি প্রয়োজন কেবলমাত্র টাইপিং কম হয় তবে আপনি কেন কেবল ফোল্ডারটি $ PATH এ রাখেন না? বা folder PATH- র কোনও ফোল্ডার থেকে এমপিএক্সেক-তে একটি সিমলিংক তৈরি করবেন? বা (আমার প্রিয়) কলটি স্ক্রিপ্টটিতে আপনার উত্সটি কোনও স্ক্রিপ্টে রাখে?


1
আমি কেন এটি আমার H PATH- তে রাখতে পারি না কারণ আমার অন্য ডিরেক্টরিতে আমার আরও একটি 'mpiexec' ফাইল রয়েছে যা আমার $ PATH তে যুক্ত রয়েছে। আমি যদি এই নতুন 'এমপিেক্সেক'-এর পথটি যুক্ত করি তবে এটি সম্ভবত তাদের উভয়কেই কার্যকর করার চেষ্টা করবে ... তাই না?
পল

1
কেন সহজভাবে ব্যবহার করবেন না তা বুঝতে পারছেন না "$@"
enzotib

2
পল, এটি দু'জনের নয়, প্রথমে পথের প্রথমটিকে কার্যকর করার চেষ্টা করবে।
অহংকার

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