ฉันจะรันเชลล์สคริปต์ได้อย่างไรโดยไม่ใช้คำสั่ง“ sh” หรือ“ bash”


261

ฉันมีเชลล์สคริปต์ที่ฉันต้องการเรียกใช้โดยไม่ใช้คำสั่ง "sh" หรือ "bash" ตัวอย่างเช่น:

แทน: sh script.sh

ฉันต้องการใช้: script.sh

ฉันจะทำสิ่งนี้ได้อย่างไร

PS (i) ฉันไม่ได้ใช้เชลล์สคริปต์มากนักและฉันพยายามอ่านเกี่ยวกับชื่อแทน แต่ฉันไม่เข้าใจวิธีใช้พวกเขา

(ii) ฉันยังอ่านเกี่ยวกับการเชื่อมโยงสคริปต์กับไฟล์อื่นในตัวแปร PATH ฉันใช้เซิร์ฟเวอร์มหาวิทยาลัยของฉันและฉันไม่มีสิทธิ์ในการสร้างไฟล์ในสถานที่เหล่านั้น


1
คำตอบแสดงให้เห็นว่าจะทำให้สคริปต์ทำงานได้อย่างไร แต่ดูเหมือนจะไม่ครอบคลุมถึงวิธีการเข้าถึงสคริปต์ หากต้องการให้สร้างไดเรกทอรี bin ด้วยตัวเอง$HOME/bin- หากคุณยังไม่มีให้เพิ่มไดเรกทอรีดังกล่าวลงใน PATH (ใกล้กับด้านหน้า) ใส่สคริปต์ (และโปรแกรมอื่น ๆ ) ที่คุณต้องการเรียกใช้โดยตรงโดยไม่ต้องระบุชื่อพา ธ ที่นี่หรือเชื่อมโยงที่นี่ไปยังที่ที่โปรแกรมจริงอยู่
Jonathan Leffler

1
หลังจากคุณทำตามคำตอบด้านล่างเพื่อวาง ".sh" คุณสามารถเปลี่ยนชื่อไฟล์ได้: mv example.sh exampleจากนั้นexampleควรทำงานด้วยตนเอง
PJ Brunet

คำตอบ:


434

เพิ่ม "shebang" ที่ด้านบนของไฟล์ของคุณ:

#!/bin/bash

และทำให้ไฟล์ของคุณทำงานได้ ( chmod +x script.sh)

สุดท้ายปรับเปลี่ยนเส้นทางของคุณเพื่อเพิ่มไดเรกทอรีที่สคริปต์ของคุณอยู่:

export PATH=$PATH:/appropriate/directory

(โดยทั่วไปคุณต้องการ$HOME/binเก็บสคริปต์ของคุณเอง)


สวัสดีขอบคุณสำหรับคำตอบของคุณ ฉันลองแล้ว ตอนนี้ฉันสามารถเรียกใช้โดยไม่มีคำสั่ง "sh" แต่ฉันยังต้องใช้คำนำหน้าด้วย "./" ซึ่งฉันไม่ต้องการ :)
Rameez Hussain

5
ดูความคิดเห็นเกี่ยวกับเส้นทาง คุณต้องใส่สคริปต์ของคุณในไดเรกทอรีที่คุณจะต้องผนวกเข้ากับ PATH ของคุณ
fge

2
มันไม่ทำงานในกรณีของฉัน แต่source script.shทำงานได้ดีหรือมากกว่า source <filename_without_any_extension_type>
MycrofD

4
source ./my-cool-script(หรือ. ./my-cool-script) จะสร้างมลภาวะเซสชันเชลล์ปัจจุบันด้วยตัวแปรใด ๆ ที่กำหนดไว้ในสคริปต์ ไม่ควรใช้การจัดหานอกเสียจากว่าคุณต้องการแก้ไขเชลล์เซสชันอย่างชัดเจนโดยการตั้งค่า vars ของสภาพแวดล้อมการเปลี่ยนไดเรกทอรี ฯลฯ ข้อผิดพลาดที่น่ากลัวจริงๆอาจส่งผลอย่างอื่นได้เช่นตัวแปรจากการประมวลผลสคริปต์หนึ่งครั้ง
Daniel Waltrip

3
หากคุณแน่ใจว่าโฟลเดอร์สคริปต์อยู่ใน PATH และยังไม่สามารถใช้งานได้หาก./คุณมีชื่อที่ขัดแย้งกัน ลองเปลี่ยนชื่อ
chorbs

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 / local / bin ฉันกำลังใช้คอมพิวเตอร์มหาวิทยาลัย
Rameez Hussain

1
คุณช่วยบอกฉันหน่อยได้มั้ยว่าคุณหมายถึง "แหล่งสคริปต์เริ่มต้นของคุณ"
Rameez Hussain

1
การจัดหาสคริปต์เริ่มต้นหมายถึงการดำเนินการเพื่อให้พารามิเตอร์ที่ตั้งค่าใหม่เป็นตัวแปร PATH ถูกเลือกโดยเชลล์ . .bashrcซึ่งสามารถทำได้โดยการทำ นั่นคือเพียงแค่.ตามด้วยspaceชื่อสคริปต์เริ่มต้นของคุณ
jaypal singh

ฉันไม่รู้ว่าปัญหาของระบบคืออะไร ฉันสร้างเชลล์สคริปต์ใหม่ชื่อ "hello" โดยมีเพียง "echo" hello "" อยู่ในนั้น ฉันเปลี่ยนการอนุญาตแล้วลอง. / สวัสดี มันไม่ทำงาน มัน says-
รามีซฮุสเซน

คุณทำการเปลี่ยนแปลงอะไรกับสคริปต์เริ่มต้นของคุณ
jaypal singh

20

chmod +xเพียงให้แน่ใจว่ามันเป็นปฏิบัติการโดยใช้ ตามค่าเริ่มต้นไดเรกทอรีปัจจุบันไม่ได้อยู่ใน PATH ของคุณดังนั้นคุณจะต้องเรียกใช้งานเป็น./script.sh- หรืออ้างอิงโดยเส้นทางที่ผ่านการรับรอง หรือหากคุณต้องการเพียงแค่script.shคุณจะต้องเพิ่มลงในเส้นทางของคุณ (คุณอาจไม่สามารถเข้าถึงการปรับเปลี่ยนเส้นทางของระบบ แต่เกือบจะแน่นอนคุณสามารถปรับเปลี่ยนเส้นทางของสภาพแวดล้อมในปัจจุบันของคุณเอง.) #!/bin/shนอกจากนี้ยังสันนิษฐานว่าสคริปต์ของคุณเริ่มต้นด้วยสิ่งที่ชอบ

คุณยังสามารถใช้นามแฝงซึ่งไม่เกี่ยวข้องกับการเขียนสคริปต์เชลล์ แต่เพียงแค่เชลล์และใช้งานง่ายเช่น:

alias script.sh='sh script.sh'

ซึ่งจะช่วยให้คุณสามารถใช้เพียงแค่script.sh(ตัวอักษร - นี้จะไม่ทำงานสำหรับอื่น ๆ*.shไฟล์) sh script.shแทน


เฮ้! ขอบคุณสำหรับการตอบกลับของคุณ. ฉันลองใช้นามแฝงก่อนหน้านี้ แต่ไม่มีอะไรเกิดขึ้น ฉันวางไว้หลังบรรทัด "#! / usr / local / bin / bash" คุณคิดว่าอะไรผิด
Rameez Hussain

1
ไม่สามารถกำหนดนามแฝงในสคริปต์ของคุณได้ - จะต้องประกาศเป็นส่วนหนึ่งของสภาพแวดล้อมปัจจุบันของคุณ ดังนั้นเพียงแค่รันaliasคำสั่งที่พร้อมต์เชลล์จากนั้นนามแฝงจะพร้อมใช้งานเพื่อรันคำสั่งด้วย
ziesemer

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ไว้สำหรับ OS อย่างเคร่งครัด
tripleee

ไม่จำเป็นต้องใช้sudo chmodไฟล์ของคุณเอง
tripleee

ไม่จำเป็นต้องรีบูตเครื่อง ที่มากที่สุดคุณควรมาอีกครั้ง
Luca Di Liello

14

คุณต้องเปิดใช้งานบิตที่ปฏิบัติการได้สำหรับโปรแกรม

chmod +x script.sh

จากนั้นคุณสามารถใช้ ./script.sh

คุณสามารถเพิ่มโฟลเดอร์ใน PATH ใน.bashrcไฟล์ของคุณ(อยู่ในโฮมไดเร็กตอรี่ของคุณ) เพิ่มบรรทัดนี้ในตอนท้ายของไฟล์:

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

ฉันลืมที่จะพูดถึงว่าฉันได้กำหนดสิทธิ์ที่เหมาะสมแล้ว ฉันใช้คำสั่ง "chmod 755 script.sh"
Rameez Hussain

6

คุณสามารถพิมพ์ sudo install (ชื่อของสคริปต์) / usr / local / bin / (สิ่งที่คุณต้องการพิมพ์เพื่อเรียกใช้งานสคริปต์ดังกล่าว)

เช่นsudo install quickcommit.sh /usr/local/bin/quickcommit ป้อนรหัสผ่าน

ตอนนี้สามารถทำงานได้โดยไม่ต้อง. sh และในไดเรกทอรีใด ๆ


3

เพิ่ม (ไดเรกทอรีปัจจุบัน) ไปยังตัวแปร PATH ของคุณ
คุณสามารถทำได้โดยแก้ไขไฟล์. profile ของคุณ
ใส่บรรทัดต่อไปนี้ในไฟล์. profile ของคุณ
PATH=$PATH:.

เพียงแค่ให้แน่ใจว่าได้เพิ่ม Shebang ( #!/bin/bash) บรรทัดที่เริ่มต้นของสคริปต์ของคุณและทำให้สคริปต์ที่ปฏิบัติการ (โดยใช้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

เปลี่ยน / home / user เป็นไดเร็กทอรีผู้ใช้ของคุณและพิมพ์: backupscriptที่ใดก็ได้บนเทอร์มินัลเพื่อรันสคริปต์ (สมมติว่า / usr / bin อยู่ในเส้นทางของคุณ)


0

ป้อน"#!/bin/sh"ก่อนสคริปต์ จากนั้นให้บันทึกเป็นscript.shตัวอย่าง คัดลอกไปยัง $HOME/bin หรือ $HOME/usr/bin
ไดเรกทอรีสามารถแตกต่างกันใน distros linux ที่แตกต่างกัน แต่ลงท้ายด้วย 'bin' และอยู่ในโฮมไดเร็กตอรี่ cd $HOME/bin หรือ $HOME/usr/bin
Type chmod 700 script.sh
และคุณสามารถเรียกใช้ได้เพียงแค่พิมพ์ run.sh บนเทอร์มินัล ถ้ามันไม่ทำงานลอง chmod +x run.sh แทน chmod 700 run.sh


ส่วนต่าง ๆ ของคำตอบนี้ที่ไม่ซ้ำซ้อนข้อมูลจากคำตอบเก่าที่มีอยู่จะสับสน
tripleee

0

ทำให้ไฟล์ใด ๆ ที่ปฏิบัติการได้


สมมติว่าคุณมีไฟล์ปฏิบัติการที่เรียกว่า migrate_linux_amd64 และคุณต้องการเรียกใช้ไฟล์นี้เป็นคำสั่งเช่น "migrate"

  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 / local / bin ให้กับเส้นทางหรือโปรไฟล์ผู้ใช้ของคุณ
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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.