मैं "sh" या "bash" कमांड का उपयोग किए बिना शेल स्क्रिप्ट कैसे चला सकता हूं?


261

मेरे पास एक शेल स्क्रिप्ट है जिसे मैं "श" या "बैश" कमांड का उपयोग किए बिना चलाना चाहता हूं। उदाहरण के लिए:

के बजाय: sh script.sh

मैं उपयोग करना चाहता हूँ: script.sh

मैं यह कैसे कर सकता हूँ?

PS (i) मैं शेल स्क्रिप्ट का उपयोग नहीं करता हूं और मैंने उपनामों के बारे में पढ़ने की कोशिश की है, लेकिन मुझे समझ नहीं आया कि उन्हें कैसे उपयोग किया जाए।

(ii) मैं पैथ चर में स्क्रिप्ट को किसी अन्य फ़ाइल के साथ लिंक करने के बारे में भी पढ़ता हूं। मैं अपने विश्वविद्यालय के सर्वर का उपयोग कर रहा हूं और मेरे पास उन स्थानों में फ़ाइल बनाने की अनुमति नहीं है।


1
उत्तर संकेत देते हैं कि स्क्रिप्ट को कैसे निष्पादित किया जा सकता है, लेकिन इसे सुलभ बनाने के लिए कैसे कवर करना नहीं चाहिए। उसके लिए, अपने आप को एक बिन निर्देशिका बनाएं - $HOME/bin- यदि आपके पास पहले से कोई नहीं है, तो इसे अपने पैट (सामने के पास) में जोड़ें। उन स्क्रिप्ट्स (और किसी भी अन्य प्रोग्राम) को रखें जिन्हें आप सीधे यहां बिना किसी पाथनाम के निर्दिष्ट करना चाहते हैं, या जहां वास्तविक कार्यक्रम हैं, वहां सहानुभूति रखें।
जोनाथन लेफ़लर

1
नीचे दिए गए उत्तर (ओं) का पालन करने के बाद, ".sh" को छोड़ने के लिए आप फ़ाइल का नाम बदल सकते हैं: mv example.sh exampleऔर फिर exampleअपने आप ही काम करना चाहिए।
पीजे ब्रुनेट

जवाबों:


434

अपनी फ़ाइल के शीर्ष पर "shebang" जोड़ें:

#!/bin/bash

और अपनी फ़ाइल को निष्पादन योग्य ( chmod +x script.sh) बनाएं ।

अंत में, निर्देशिका को जोड़ने के लिए अपना पथ संशोधित करें जहां आपकी स्क्रिप्ट स्थित है:

export PATH=$PATH:/appropriate/directory

(आम तौर पर, आप $HOME/binअपनी स्वयं की स्क्रिप्ट संग्रहीत करने के लिए चाहते हैं)


अरे आपके उत्तर के लिए धन्यवाद। मैंने कोशिश की कि बाहर। अब मैं इसे "श" कमांड के बिना चला सकता हूं। लेकिन मुझे अभी भी "./" के साथ कमांड को उपसर्ग करना है जो मैं नहीं करना चाहता। :)
रमीज हुसैन

5
रास्ते के बारे में टिप्पणियाँ देखें। आपको अपनी स्क्रिप्ट को एक निर्देशिका में रखने की आवश्यकता है जिसे आपको अपने पेटीएम में जोड़ना होगा।
fge

2
यह मेरे मामले में काम नहीं किया। लेकिन source script.shठीक काम किया, या बल्कि source <filename_without_any_extension_type>
MycrofD

4
source ./my-cool-script(या . ./my-cool-script) स्क्रिप्ट में परिभाषित किसी भी चर के साथ वर्तमान शेल सत्र को प्रदूषित करेगा। सोर्सिंग का उपयोग तब तक नहीं किया जाना चाहिए जब तक कि आप स्पष्ट रूप से एनवायरमेंट वर्जन सेट करके, डायरेक्टरी में बदलाव करके शेल सेशन को संशोधित नहीं करना चाहते हैं, इत्यादि वास्तव में भयानक बग का परिणाम हो सकता है, क्योंकि एक स्क्रिप्ट निष्पादन से वेरिएबल, यदि सोर्सिंग के माध्यम से किया जाता है, तो अन्य स्क्रिप्ट निष्पादन को प्रभावित कर सकता है।
डेनियल वालट्रिप

3
यदि आप सुनिश्चित हैं कि स्क्रिप्ट फ़ोल्डर PATH में है, और यह अभी भी बिना काम नहीं करता है ./, तो आपका नाम टक्कर हो सकता है। नाम बदलने का प्रयास करें।
6

66

ये सीधे स्क्रिप्ट नाम का उपयोग करने के कुछ आवश्यक शर्तें हैं:

  1. she-bang (#!/bin/bash)बहुत ऊपर लाइन जोड़ें ।
  2. chmod u+x scriptnameस्क्रिप्ट को निष्पादन योग्य बनाने का उपयोग करना। ( scriptnameआपकी स्क्रिप्ट का नाम कहां है)
  3. स्क्रिप्ट को /usr/local/binफ़ोल्डर में रखें।
  4. स्क्रिप्ट के नाम का उपयोग करके स्क्रिप्ट को चलाएं।

नोट: इसका कारण मैंने इसे /usr/local/binफ़ोल्डर के अंतर्गत रखने का सुझाव दिया है क्योंकि सबसे अधिक संभावना है कि पथ पहले से ही आपके लिए जोड़ा जाएगा PATH variable

अपडेट करें:

यदि आपके पास /usr/local/binफ़ोल्डर तक पहुंच नहीं है, तो निम्न कार्य करें:

  1. अपने होम डायरेक्टरी में एक फोल्डर बनाएं और उसे कॉल करें myscripts
  2. क्या ls -lartस्टार्ट-अप स्क्रिप्ट अपने खोल उपयोग कर रहा है पहचान करने के लिए अपने घर निर्देशिका पर,। यह या तो होना चाहिए .profileया .bashrc
  3. एक बार जब आप स्टार्ट अप स्क्रिप्ट की पहचान कर लेते हैं, तो अपनी स्क्रिप्ट में निम्न पंक्ति जोड़ें - export set PATH=$PATH:~/myscript
  4. एक बार जोड़ने के बाद, अपनी स्टार्ट-अप स्क्रिप्ट का स्रोत या लॉग आउट करें और वापस लॉग इन करें।
  5. अपनी स्क्रिप्ट का उपयोग करके निष्पादित करें scriptname

मैंने ऐसा करने की कोशिश की, लेकिन मेरे पास / usr / स्थानीय / बिन फ़ोल्डर तक पहुंचने की अनुमति नहीं है। मैं एक विश्वविद्यालय कंप्यूटर का उपयोग कर रहा हूं।
रमीज हुसैन

1
क्या आप मुझे बता सकते हैं कि "स्रोत आपकी स्टार्ट-अप स्क्रिप्ट" से आपका क्या मतलब है?
रमीज हुसैन 18

1
स्टार्ट-अप स्क्रिप्ट को सोर्स करने का मतलब है कि इसे निष्पादित करना ताकि पैथ वेरिएबल के लिए नया सेट पैरामीटर शेल द्वारा उठाया जाए। यह करके देखा जा सकता है . .bashrc। यही है, बस के .बाद spaceऔर फिर अपने स्टार्ट-अप स्क्रिप्ट नाम डाल दिया ।
जयपाल सिंह

मुझे नहीं पता कि सिस्टम में क्या समस्या है। मैंने इसमें एक "इको" हैलो "के साथ" हैलो "नामक एक नई शेल स्क्रिप्ट बनाई। मैंने इसकी अनुमतियां बदलीं और कोशिश की ।/hello यह काम नहीं किया। यह कहता
रमीज हुसैन

आपने अपनी स्टार्ट-अप स्क्रिप्ट्स में क्या बदलाव किए हैं?
जयपाल सिंह

20

बस सुनिश्चित करें कि यह प्रयोग करने योग्य है chmod +x। डिफ़ॉल्ट रूप से, वर्तमान निर्देशिका आपके PATH पर नहीं है, इसलिए आपको इसे निष्पादित करने की आवश्यकता होगी ./script.sh- या अन्यथा इसे किसी योग्य पथ से संदर्भित करें। वैकल्पिक रूप से, यदि आपको वास्तव में बस जरूरत है, तो आपको script.shइसे अपने पेट में जोड़ना होगा। (आपके पास सिस्टम पथ को संशोधित करने के लिए पहुंच नहीं हो सकती है, लेकिन आप अपने वर्तमान परिवेश के पथ को लगभग निश्चित रूप से संशोधित कर सकते हैं।) यह भी मानता है कि आपकी स्क्रिप्ट कुछ इस तरह से शुरू होती है।#!/bin/sh

आप अभी भी एक उपनाम का उपयोग कर सकते हैं, जो वास्तव में शेल स्क्रिप्टिंग से संबंधित नहीं है, लेकिन सिर्फ शेल है, और जैसा कि सरल है:

alias script.sh='sh script.sh'

जो आपको सिर्फ script.sh(शाब्दिक - यह किसी अन्य *.shफ़ाइल के लिए काम नहीं करेगा ) के बजाय का उपयोग करने की अनुमति देगा sh script.sh


अरे! आपके जवाब के लिए धन्यवाद। मैंने पहले उपनाम का उपयोग करने की कोशिश की। पर कुछ नहीं हुआ। मैंने इसे "#! / Usr / लोकल / बिन / बैश" लाइन के तुरंत बाद रखा। तुम्हें क्या लगता है क्या गलत है?
रमीज हुसैन

1
एक उपनाम आपकी स्क्रिप्ट के भीतर परिभाषित नहीं किया जा सकता है - इसे आपके वर्तमान परिवेश के हिस्से के रूप में घोषित किया जाना है। तो बस aliasशेल प्रॉम्प्ट पर कमांड चलाएं , और फिर उपनाम कमांड को चलाने के लिए उपलब्ध होगा।
ज़ीसेमर

17

इस उदाहरण में फ़ाइल को बुलाया जाएगा myShell

सबसे पहले हमें इस फाइल को बनाने की आवश्यकता होगी जिसे हम केवल निम्नलिखित लिखकर शुरू कर सकते हैं:

sudo nano myShell

ध्यान दें कि हमने .shविस्तार नहीं किया है ? ऐसा इसलिए है क्योंकि जब हम इसे टर्मिनल से चलाते हैं तो हमें केवल टाइप करना होगाmyShell अपनी कमांड चलाने के !

अब, नैनो में शीर्ष पंक्ति जरूरी है #!/bin/bashतो आप जारी रखने से पहले एक नई पंक्ति छोड़ सकते हैं।

प्रदर्शन के लिए मैं एक मूल Hello World!प्रतिक्रिया जोड़ूंगा

तो, मैं निम्नलिखित टाइप करता हूं:

echo Hello World!

उसके बाद मेरा उदाहरण इस तरह दिखना चाहिए:

#!/bin/bash
echo Hello World!

अब फाइल को सेव करें और फिर इस कमांड को रन करें:

sudo chmod +x myShell

अब हमने फ़ाइल को निष्पादन योग्य बना दिया है जिसे हम /usr/bin/निम्नलिखित कमांड का उपयोग करके इसे स्थानांतरित कर सकते हैं :

sudo cp myShell /usr/bin/

बस यह सुनिश्चित करने के लिए कि मशीन इसे ठीक से निष्पादित कर सकती है हमें मशीन को रिबूट करने की आवश्यकता होगी

मैंनें इस्तेमाल किया sudo shutdown -r now

बधाई! अब हमारी आज्ञा हो गई है! टर्मिनल में हम टाइप कर सकते हैं myShellऔर यह कहना चाहिएHello World!


1
आपको अपनी खुद की फाइलें नहीं डालनी चाहिए /usr/bin- कई सिस्टम /usr/local/binइस उद्देश्य के /usr/binलिए देते हैं और ओएस के लिए सख्ती से आरक्षित करते हैं।
ट्रिपल

sudo chmodआपकी अपनी फ़ाइल की कोई आवश्यकता नहीं है ।
त्रिवेणी

मशीन को रिबूट करने की आवश्यकता नहीं है। अधिक से अधिक आप फिर से स्रोत करें
Luca Di Liello

14

आपको प्रोग्राम के लिए निष्पादन योग्य बिट सक्षम करना होगा।

chmod +x script.sh

तब आप उपयोग कर सकते हैं ./script.sh

आप अपनी .bashrcफ़ाइल में फ़ोल्डर को PATH में जोड़ सकते हैं (आपके होम डायरेक्टरी में स्थित)। इस पंक्ति को फ़ाइल के अंत में जोड़ें:

export PATH=$PATH:/your/folder/here

मैं यह उल्लेख करना भूल गया कि मैंने पहले ही सही अनुमतियां निर्धारित कर दी हैं। मैंने "chmod 755 script.sh" कमांड का इस्तेमाल किया
रमीज हुसैन

6

आप sudo install (स्क्रिप्ट का नाम) / usr / लोकल / बिन / (आप जो स्क्रिप्ट टाइप करना चाहते हैं टाइप करने के लिए टाइप कर सकते हैं)

पूर्व: sudo install quickcommit.sh /usr/local/bin/quickcommit पासवर्ड दर्ज करें

अब .sh और किसी भी डायरेक्टरी में चला सकते हैं


3

जोड़ें। (वर्तमान निर्देशिका) अपने पथ चर के लिए।
आप अपनी .profile फ़ाइल को संपादित करके ऐसा कर सकते हैं।
अपनी .profile फ़ाइल में निम्न पंक्ति
PATH=$PATH:.

डालें #!/bin/bash। अपनी स्क्रिप्ट के आरंभ में Shebang ( ) लाइन जोड़ना सुनिश्चित करें और स्क्रिप्ट को निष्पादन योग्य (उपयोग करके chmod +x <File Name>) बनाएं ।


0

यहां मेरी बैकअप स्क्रिप्ट है जो आपको विचार और स्वचालन प्रदान करेगी:

सर्वर: Ubuntu 16.04 PHP: 7.0 Apache2, Mysql आदि ...

# Make Shell Backup Script - Bash Backup Script
    nano /home/user/bash/backupscript.sh
        #!/bin/bash
        # Backup All Start
        mkdir /home/user/backup/$(date +"%Y-%m-%d")
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_rest.zip /etc -x "*apache2*" -x "*php*" -x "*mysql*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_apache2.zip /etc/apache2
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_php.zip /etc/php
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_mysql.zip /etc/mysql
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_rest.zip /var/www -x "*html*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_html.zip /var/www/html
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/home_user.zip /home/user -x "*backup*"
        # Backup All End
        echo "Backup Completed Successfully!"
        echo "Location: /home/user/backup/$(date +"%Y-%m-%d")"

    chmod +x /home/user/bash/backupscript.sh
    sudo ln -s /home/user/bash/backupscript.sh /usr/bin/backupscript

परिवर्तन / घर / उपयोगकर्ता को अपनी उपयोगकर्ता निर्देशिका और प्रकार: स्क्रिप्ट चलाने के लिए टर्मिनल पर कहीं भी बैकअप ! (यह मानते हुए कि usr / bin आपके रास्ते में है)


0

"#!/bin/sh"स्क्रिप्ट से पहले दर्ज करें । फिर script.shउदाहरण के लिए इसे सहेजें । इसे कॉपी करें $HOME/bin या $HOME/usr/bin
निर्देशिका अलग-अलग लिनक्स डिस्ट्रो पर अलग हो सकती है, लेकिन वे 'bin' होम डायरेक्टरी cd $HOME/bin या $HOME/usr/bin
टाइप के साथ समाप्त होती हैं chmod 700 script.sh
और आप इसे run.sh टर्मिनल पर टाइप करके चला सकते हैं । यदि यह काम नहीं करता है, तो chmod +x run.sh इसके बजाय प्रयास करें chmod 700 run.sh


इस उत्तर के हिस्से जो बहुत पुराने मौजूदा उत्तरों से जानकारी को पुनर्स्थापित नहीं करते हैं, भ्रमित हैं।
ट्रिपल

0

किसी भी फ़ाइल को निष्पादन योग्य बनाएं


मान लीजिए कि आपके पास एक निष्पादन योग्य फ़ाइल है, जिसे migrate_linux_amd64 कहा जाता है और आप इस फ़ाइल को "माइग्रेशन" जैसे आदेश के रूप में चलाना चाहते हैं

  1. पहले फ़ाइल स्थान से निष्पादन योग्य फ़ाइल का परीक्षण करें:
[oracle@localhost]$ ./migrate.linux-amd64 
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version
  1. सुनिश्चित करें कि आपने फ़ाइल पर विशेषाधिकारों को निष्पादित किया है
    -rwxr-xr-x 1 oracle oinstall 7473971 May 18 2017 migrate.linux-amd64
    यदि नहीं, तो चलाएंchmod +x migrate.linux-amd64

  2. फिर अपनी फ़ाइल को कॉपी करें /usr/local/bin। यह निर्देशिका रूट के स्वामित्व में है, sudo का उपयोग करें या रूट पर स्विच करें और निम्न ऑपरेशन करें

sudo cp migrate.linux-amd64 /usr/local/bin
sudo chown oracle:oracle /user/local/bin/migrate.linux.amd64
  1. फिर नीचे की तरह एक प्रतीकात्मक लिंक बनाएं
sudo ln /usr/local/bin/migrate.linux.amd64 /usr/local/bin/migrate
sudo chown oracle:oracle /usr/local/bin/migrate
  1. अंत में अपने रास्ते या उपयोगकर्ता प्रोफ़ाइल में / usr / स्थानीय / बिन जोड़ें
export PATH = $PATH:/usr/local/bin
  1. फिर कमांड को "माइग्रेट" के रूप में चलाएं
[oracle@localhost]$ migrate
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.