.sh নির্দিষ্টকরণের এক্সটেনশন?


12

কেন কিছু সিস্টেম .shকেবল ফাইলের নাম নির্দিষ্ট করেই এক্সটেনশন ছাড়াই চালিত করবে এবং অন্যদের নাম যুক্ত এক্সটেনশন প্রয়োজন? আমার ক্ষেত্রে আমি এই নির্দেশাবলী অনুসরণ করে একটি ধারাবাহিক কমান্ড লেখার চেষ্টা করছি ।

আমি এখনই এক্সটেনশনটি নির্দিষ্ট করছি তবে কমান্ডগুলি ছাড়াই চালানো সক্ষম .shহওয়াই ভাল।


4
.shএক্সটেনশন হিসাবে ব্যবহার করা অনেক পরিস্থিতিতে খারাপ অনুশীলন হিসাবে বিবেচিত হয়: এটি অন্য আদেশগুলি কীভাবে নামকরণ করা হয় তার বিপরীতে (আপনি চালাবেন না ls.elf) এটি প্রায়শই বিভ্রান্তিকর হয় (যদি আপনার foo.shসূচনাটি শুরু হয় #!/bin/bash, তবে রানিং sh foo.shএটির জন্য তৈরির চেয়ে আলাদা দোভাষী দিয়ে চালাবে) ), এবং যদি আপনি foo.shপাইথন প্রোগ্রাম হিসাবে পুনরায় লেখেন , সেই এক্সটেনশনটি ব্যবহার করার অর্থ হ'ল এখন-বিভ্রান্তিকর নামটি রাখা এবং যে প্রোগ্রামটিকে কল করে তা পুনরায় লেখার মধ্যে আপনাকে বেছে নেওয়া দরকার।
চার্লস ডাফি

2
... যেখানে এটা হয় , একটি ভাল অভ্যাস শেল লাইব্রেরি সঙ্গে না কমান্ড +xসেট - যেখানে foo.shএকটি লাইব্রেরি যে কোনো POSIX শেলে sourced হতে পারে, foo.bashব্যাশ মধ্যে sourced করা যেতে পারে, foo.kshksh, ইত্যাদি মধ্যে
চার্লস ডাফি

উত্তর:


39

আপনি বিভ্রান্ত .shএক্সটেনশন শুধুমাত্র মানুষের একটি ইঙ্গিত, এবং একেবারে কোন কীভাবে সিস্টেম ফাইল পরিচালনা প্রভাব রয়েছে। ইউনিক্স / লিনাক্স উইন্ডোজকে Secrets.pdf.exeভুল করতে পারে নি ।

আপনি টাইপ করলে যা ঘটে তা এখানে foo:

  1. এর জন্য পুনঃনির্দেশ STDIN, STDOUTএবং STDERRসেট আপ করা হয়েছে।

  2. শেলটি এর অভ্যন্তরীণ হ্যাশ টেবিলটি এটি ইতিমধ্যে কোনও $PATHপ্রবেশিকা জানে কিনা তা পরীক্ষা করে দেখুন foo। যদি কোনও উপস্থিত না থাকে, শেলটি ডিরেক্টরিগুলি অনুসন্ধান করে $PATH, এমন একটি ফাইল fooসন্ধান করে যা এর ফাইল অনুমতিগুলিতে এক্সিকিউট বিট সেট করে। প্রথম fooজয়।

  3. যদি ফাইলের প্রথম দুটি বাইট fooহয় #!, তবে পরবর্তী স্ট্রিংটি চালানোর জন্য একটি দোভাষীর নাম। এইভাবে #!/bin/bashএকটি বাশ লিপি #!/usr/bin/perlপ্রবর্তন করে, পার্ল স্ক্রিপ্ট ইত্যাদি প্রবর্তন করে

  4. যদি ফাইলটি শুরু হয় তবে \177ELFএটি একটি বাইনারি কার্যকর করা যায় এবং ld.soএটি শুরু হয়।

পড়ুন man execveএবং man ld.soআরও বিশদ ব্যাখ্যার জন্য।


15
হ্যাঁ, লিনাক্সে আপনি Secrets.pdf- এ ডাবল ক্লিক করতে পারেন নামটি থেকে কোনও চিহ্ন ছাড়াই এটি আসলে একটি
নির্বাহযোগ্য

1
@ ওরেঞ্জডগ আমি জানি যে আপনি মজা করছেন, তবে আমার মনে হচ্ছে যে আমাকে নির্ধারণ করতে হবে যে এক্সিকিউটেবল বিট ( chmod +x) এটি বেশ সমাধান করে, তাই না?
wchargin

3
@ ডাব্লুচারগিন এটি নির্ভর করে যে আপনার ফাইল সিস্টেমটি কতটা ভাল আচরণ করেছে (যেমন মাউন্ট করা নেটওয়ার্ক শেয়ার বা এনটিএফএস পার্টিশনটি আশাবাদীভাবে xসব কিছুতে বিট সেট করতে পারে ) এবং ফাইলটি কোথা থেকে এসেছে (ডিরেক্টরিতে নিয়ন্ত্রণের যে কোনও প্রক্রিয়া অনুমতি নির্ধারণে ট্রিক করা যেতে পারে) । সুতরাং, এটি এটিকে প্রশমিত করে, তবে আমি বলব না এটি এটি সমাধান করে।
আইএমএসওপি

2
@ ডাব্লুচারগিন, তবুও, তবে আমি মনে করি যে তাঁর বক্তব্যটি সাধারণত ফাইল ম্যানেজারগুলি এক্সিকিউটেবল বিট প্রদর্শন করে না, অর্থাত্ এক্সটেনশনের মতো "মানুষের প্রতি ইঙ্গিত" নেই।
পল ড্রাগার

1
আমি ভুলবশত কখনই ক্লিক করতে পারি না Secrets.pdf.exeকারণ আমি সবসময় hide file extension
মূ

12

মূল বক্তব্যটি হ'ল এক্সটেনশনগুলি ইউনিক্সের মতো সিস্টেম সিস্টেমে অপ্রাসঙ্গিক A একটি ফাইলের নাম স্রেফ নাম এবং স্ক্রিপ্ট বা সংকলিত এক্সিকিউটেবল চালানো যায় কিনা তার কোনও প্রভাব নেই । কোনও প্রোগ্রামার .shএকটি ফাইল শেল স্ক্রিপ্ট, বা .pyপাইথন স্ক্রিপ্টের জন্য মনোনীত করতে একটি এক্সটেনশন যুক্ত করতে পারে , তবে উইন্ডোজ থেকে ভিন্ন, কোনও ইউনিক্স নামকরণের বিষয়ে চিন্তা করে না, এটি অনুমতিগুলির বিষয়ে চিন্তা করে।

যা গুরুত্বপূর্ণ তা হ'ল কোনও ফাইলকে কার্যকর করা অনুমতি। যা দিয়ে আপনি চেক করতে পারেন

ls -l /path/to/file

এক্সিকিউটেবল চলমান

স্ক্রিপ্ট চালানোর জন্য সাধারণত বিভিন্ন উপায় রয়েছে।

  • আপনার বর্তমান ডিরেক্টরি যদি স্ক্রিপ্টের মতো হয় এবং স্ক্রিপ্টে এক্সিকিউটেবল অনুমতি থাকে তবে আপনি এ জাতীয় চালনা করতে পারেন ./my_script_name.বর্তমান ডিরেক্টরী মানে।
  • যদি আপনার বর্তমান ডিরেক্টরিটি পৃথক এবং স্ক্রিপ্টের এক্সিকিউটেবল অনুমতি রয়েছে তবে আপনি এটি পুরো পথটি নির্দিষ্ট করে চালাতে পারেন: /home/user/bin/my_script_name

(উপরের দুটি পদ্ধতি এক্সিকিউটেবল অনুমতি সেট থাকার উপর নির্ভর করে; ফাইলটি $PATHভেরিয়েবলের অংশ কিনা তা অপ্রাসঙ্গিক। #!লাইনের উপস্থিতিও গুরুত্বপূর্ণ; এটি ছাড়া এটি স্ক্রিপ্টটি আপনার খোলার বর্তমান শেল দ্বারা কার্যকর করা হবে If আমার কাছে cshস্ক্রিপ্ট থাকলে এই লাইনটি ছাড়াই এবং এটির সাথে ব্যাশ চালানোর চেষ্টা করুন ./my_script.csh, এটি ব্যর্থ হবে)

  • যদি আপনার স্ক্রিপ্টটি এমন ডিরেক্টরিতে অবস্থিত যা আপনার $PATHভেরিয়েবলের অংশ , আপনি কেবল নামটি কল করে চালাতে পারেন। আপনি chmodকেবল কমান্ড লাইনে কমান্ডকে নামটি টাইপ করে কল করতে পারেন কারণ এটি /binফোল্ডারে রয়েছে। /binসর্বদা $PATHপরিবর্তনশীল অংশ । এই ক্ষেত্রে এক্সিকিউটেবল অনুমতি এবং স্ক্রিপ্ট বিষয়টি স্থান
  • কমান্ড এবং স্ক্রিপ্টকে আর্গুমেন্ট হিসাবে কোনও দোভাষীকে নির্দিষ্ট করে। এইভাবে স্ক্রিপ্ট ইন্টারপ্রেটারে ইনপুট ফাইল হিসাবে পরিবেশন করবে।
  • একটি ফাইল সোর্সিং . filename.shঅথবা source filename.shস্ক্রিপ্ট চিকিত্সা করা যেমন যদি এটা কীবোর্ড ইনপুট, অর্থাত্ ছিল যেমন যদি এটা কমান্ড লাইন মধ্যে সরাসরি টাইপ করা করতে হবে। এই ক্ষেত্রে এক্সিকিউটেবল অনুমতি এবং অবস্থান গুরুত্বপূর্ণ নয়

উদাহরণ

অনুমতিগুলি সম্পাদনের জন্য দোভাষীর সাথে চলমান # 1 উদাহরণ

$-> ls -l abc.py                                                               
-rw-rw-r-- 1 xieerqi xieerqi 44 Apr 27 22:39 abc.py
$-> python abc.py                                                              
a
b
c

উদাহরণ # 2, ./এক্সিকিউটেবল অনুমতি সেট দিয়ে চলছে , শেবাং লাইন সেট।

$-> cat abc.py                                                                 
#!/usr/bin/env python
for letter in 'a' 'b' 'c' :
   print letter
$-> ls -l abc.py
-rwxrwxr-x 1 xieerqi xieerqi 66 Apr 27 23:02 abc.py*
$-> ./abc.py                                                                   
a
b
c

উদাহরণ # 3, শেবাং লাইন সেট ব্যতীত চলমান (ব্যর্থ হয়, কারণ বাশ পাইথন স্ক্রিপ্টগুলি পড়তে পারে না; কোনও শেবাং লাইন বর্তমান শেলটিকে দোভাষী হিসাবে ধরে নেয় না)

$-> cat abc.py                                                                 
for letter in 'a' 'b' 'c' :
   print letter
$-> ./abc.py                                                                   
./abc.py: 2: ./abc.py: Syntax error: word unexpected (expecting "do")

উদাহরণ # 4, চলমান স্ক্রিপ্ট যাতে কার্যকরযোগ্য অনুমতি রয়েছে ফর্ম ফোল্ডার যা $PATHভেরিয়েবলের অংশ

#  /home/xieerqi/bin is part of my path variable
$-> echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/microchip/xc16/v1.25/bin:/opt/microchip/xc32/v1.40/bin:/opt/microchip/xc8/v1.35/bin:/home/xieerqi/bin:/home/xieerqi/bin/sh

$-> # current directory is /home/xieerqi
$-> pwd
/home/xieerqi
$-> # move the file to ~/bin
$-> mv ~/abc.py ~/bin/abc.py
$-> # now I can run it just by calling the name
$-> abc.py
/home/xieerqi/bin/abc.py: 2: /home/xieerqi/bin/abc.py: Syntax error: word unexpected (expecting "do")
$-> # Syntax error because again, no interpreter specified.                    
$-> # must add #!/usr/bin/env python
$-> vi /home/xieerqi/bin/abc.py          
$-> # after adding the line with vi text editor, we can run
$-> abc.py                                                                     
a
b
c

# 5 উদাহরণ, এক্সটেনশন সরানো, এখনও চালায় কারণ এক্সটেনশানগুলি গুরুত্বপূর্ণ নয়, তবে এটির অনুমতি রয়েছে এবং এর অংশ $PATH:

$-> mv ~/bin/abc.py  ~/bin/abc                                                 
$-> abc
a
b
c

আমি কমান্ডটি চালিয়েছি এবং এই '-rwxr-x ---' পেয়েছি। আমি কী পড়তে মান চাই এবং আমি কীভাবে এটি পরিবর্তন করতে পারি?
ফিলিপ কির্কব্রাইড

বা আপনি কি বলছেন যে আমি কেবল 'ফাইলনাম' নামকরণ করে 'ফাইলনাম' রাখতে পারি?
ফিলিপ কির্কব্রাইড

1
@ ফিলিপকির্কব্রাইড নাম অপ্রাসঙ্গিক। আপনি আপনার কমান্ড কিভাবে চালায়? এটা কোথায়? ডিরেক্টরিটি কি এটি আপনার অংশে রয়েছে PATH?
সের্গেই কোলোডিয়াজনি

ফিলিপকিরকব্রাইড আমাকে আরও পরিষ্কার করার জন্য এক মিনিটের মধ্যে আমার উত্তরটি প্রসারিত করুন।
সের্গেই কোলোডিয়াজনি

1
কটাক্ষপাত man chmodসেট অনুমতির কিভাবে দেখতে
নিক Mertin

6

ইতিমধ্যে এখানে ভাল ব্যাখ্যা। আমি কেবল এটি যুক্ত করতে চেয়েছিলাম আদর্শভাবে আপনার এক্সিকিউটেবলের জন্য ফাইল এক্সটেনশন ব্যবহার করা উচিত নয়।

সাধারণত আপনাকে অপেক্ষাকৃত সহজ কিছু অর্জন করতে হবে এবং আপনি একটি সামান্য শেল স্ক্রিপ্ট দিয়ে শুরু করুন। সময়ের সাথে সাথে আপনি আপনার স্ক্রিপ্টে আরও বেশি কার্যকারিতা যুক্ত করা শুরু করেন, যতক্ষণ না এটি কিছুটা সময় অবধি কল্পনাশক্তিহীন হয়ে যায় বা আপনার এমন কিছু কার্যকারিতা প্রয়োজন যা আপনি শেল স্ক্রিপ্টের সাহায্যে সহজেই সম্পাদন করতে পারবেন না এবং এই শেল স্ক্রিপ্টটিকে অন্য ভাষায় পুনরায় লেখার বিষয়ে ভাবেন না (পাইথন) , পার্ল, ...?)।

স্ক্র্যাচ থেকে পুনর্লিখন সাধারণত একটি ত্রুটি হিসাবে বিবেচিত হয়, তবে স্ক্রিপ্টগুলির জন্য এটি বোধগম্য হতে পারে কারণ সাধারণত সেগুলি বড় হয় না বা প্রচুর কার্যকারিতা থাকে। তবে আসুন ধরে নেওয়া যাক যে প্রাথমিক শেল স্ক্রিপ্টের কার্যকারিতা এবং প্যারাম / পতাকা বজায় রেখে অন্য কোনও ভাষায় স্ক্র্যাচ থেকে পুনরায় লেখা সম্ভব ible

এই স্ক্রিপ্টটির ব্যবহারকারীদের এই ভাষা পরিবর্তনের বিষয়ে সচেতন হওয়ার দরকার নেই, তারা একই কমান্ড চালিয়ে যাবেন এবং এটি কাজ চালিয়ে যাবে।

যদি আপনার স্ক্রিপ্টটির নাম দেওয়া হয়েছিল do-something.sh, তবে এটি চালিয়ে যেতে পারে do-something.sh, তবে এখন এটি অজগর (উদাহরণস্বরূপ) এ লেখা হয়েছে, এবং তাই আপনার প্রাথমিক ইঙ্গিতটি এখন সম্পূর্ণ বিভ্রান্তিকর।


4

কোনও এক্সটেনশন ছাড়াই ফাইলগুলি চালানোর জন্য আপনাকে সাধারনত খুব বেশি কিছু করার দরকার নেই, কেবলমাত্র নিশ্চিত হোন যে আপনার কাছে (ব্যাশ স্ক্রিপ্টগুলির ক্ষেত্রে) খুব প্রথম লাইনে সঠিক শেবাং লাইন রয়েছে:

#!/bin/bash

তারপরে আপনার দরকার হয় এই পদ্ধতি দ্বারা ফাইলটির জন্য ফাইলটি কার্যকর করা make

chmod 755 yourfilename

chmod +x yourfilenameসংখ্যাগুলি ব্যবহার করে বোঝানো সহজ explained

এটি যুক্ত অষ্টালগুলির একটি সংখ্যা ট্রিপল, প্রথম সংখ্যাটি ব্যবহারকারীর জন্য দাঁড়িয়েছে, দ্বিতীয়টি গ্রুপের জন্য এবং তৃতীয়টি অন্যদের জন্য, এটির জন্য আপনি আরও এখানে খুঁজে পেতে পারেন ।

এবং আপনি যদি আপনার স্ক্রিপ্টের মতো একই ডিরেক্টরিতে থাকেন তবে এটির ./মতো ব্যবহার করতে ভুলবেন না :

./yourfilename

এই চেষ্টা। দুর্ভাগ্যক্রমে আসল ফলাফল থেকে কোনও পার্থক্য নেই।
ফিলিপ ক

ফিলিপকির্কব্রাইডের আমার সংশোধিত উত্তরের দিকে একবার নজর দিন এটি সম্ভবত আরও কিছুটা আলোকপাত করবে।
ভিডিওনাথ

0

.Sh প্রত্যয়টি আসলে পথে যেতে পারে, কারণ এটি চালানোর জন্য আপনাকে কেবল মাইক্রিপ্টের পরিবর্তে myscript.sh টাইপ করতে হবে যা কার্যকর হবে না। একে .শ প্রত্যয় ছাড়াই একে "মাইক্রিপ্ট" বলা ভাল, এবং "ফাইল" কমান্ডের দ্রুত ব্যবহার আপনাকে জানায় যে এটি বাইনারি এক্সিকিউটেবল (লিনাক্সে ইএলএফ ফর্ম্যাট) বা শেল স্ক্রিপ্ট, বা অন্য যে কোনও ধরনের স্ক্রিপ্ট রয়েছে।

কিউডিওএস (কুইক অ্যান্ড ডার্টি অপারেটিং সিস্টেম, পরে মিরোসোফট পাইরেটেড করে অবৈধভাবে তাদের কাছে বিক্রি করার পরে আইবিএম দ্বারা নামকরণ করে "ডস" নামকরণ করা হয়েছে) এবং উইন্ডোজ সহ সিপি / এম এর অন্যান্য সস্তা রিপফগুলি এই সমস্তগুলি মিশ্রিত করে কারণ এই সিস্টেমে কোনও ব্যবস্থা নেই no ফাইলগুলিতে অনুমতি কার্যকর করার মতো জিনিস। এর ফলে গত 30-40 বছরে অসংখ্য সুরক্ষা পাওয়া গেছে। আসলে কয়েক মিনিট আগে আমি একটি বুবি আটকা পড়া জিপ ফাইলের সাথে বেশ কয়েকটি জাঙ্ক মেইল ​​পেয়েছি যার নাম পরিবর্তন করে MYPICTURE.JPG.zip করা হয়েছে :)

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