ฉันรู้ว่ามันลืมมันและเรียนรู้อีกครั้ง เวลาที่จะเขียนมันลงไป
ฉันรู้ว่ามันลืมมันและเรียนรู้อีกครั้ง เวลาที่จะเขียนมันลงไป
คำตอบ:
ในการรันsh
สคริปต์ที่ไม่สามารถเรียกใช้งานได้ให้ใช้:
sh myscript
ในการรันbash
สคริปต์ที่ไม่สามารถเรียกใช้งานได้ให้ใช้:
bash myscript
เพื่อเริ่มปฏิบัติการ (ซึ่งเป็นไฟล์ใด ๆ ที่มีสิทธิ์อนุญาตปฏิบัติการ); คุณเพียงแค่ระบุมันตามเส้นทางของมัน:
/foo/bar
/bin/bar
./bar
ในการทำให้สคริปต์เรียกทำงานได้ให้สิทธิ์ที่จำเป็น:
chmod +x bar
./bar
เมื่อไฟล์สามารถเรียกใช้งานได้เคอร์เนลจะเป็นผู้รับผิดชอบในการหาวิธีออกจากไฟล์ สำหรับผู้ที่ไม่ใช่ไบนารีสิ่งนี้ทำได้โดยดูที่บรรทัดแรกของไฟล์ มันควรจะมีhashbang
:
#! /usr/bin/env bash
hashbang บอกเคอร์เนลว่าจะให้โปรแกรมทำงานอะไร (ในกรณีนี้คำสั่ง/usr/bin/env
จะถูกรันด้วยอาร์กิวเมนต์bash
) จากนั้นสคริปต์จะถูกส่งไปยังโปรแกรม (เป็นอาร์กิวเมนต์ที่สอง) พร้อมกับอาร์กิวเมนต์ทั้งหมดที่คุณให้สคริปต์เป็นอาร์กิวเมนต์ที่ตามมา
นั่นหมายความว่าสคริปต์ที่เป็นปฏิบัติการทุกคนควรมี hashbang หากไม่เป็นเช่นนั้นคุณจะไม่บอกเคอร์เนลว่ามันคืออะไรดังนั้นเคอร์เนลจึงไม่ทราบว่าโปรแกรมใดที่จะใช้เพื่อทำงานระหว่างมัน มันอาจจะเป็นbash
, perl
, python
, sh
หรือสิ่งอื่น (ในความเป็นจริงเคอร์เนลมักจะใช้เชลล์เริ่มต้นของผู้ใช้เพื่อ interprete ไฟล์ซึ่งเป็นอันตรายมากเพราะมันอาจจะไม่ใช่ล่ามที่ถูกต้องเลยหรืออาจจะแยกวิเคราะห์บางส่วน แต่มีความแตกต่างของพฤติกรรมเล็กน้อยเช่น กรณีระหว่างsh
และbash
)
/usr/bin/env
โดยทั่วไปคุณจะเห็นแฮ็กเรียบเช่น:
#!/bin/bash
ผลลัพธ์คือเคอร์เนลจะรันโปรแกรม/bin/bash
เพื่อแปลสคริปต์ แต่น่าเสียดายที่ไม่ได้ให้มาเสมอโดยค่าเริ่มต้นและก็ไม่เคยมีอยู่ในbash
/bin
ในขณะที่เครื่อง Linux ก็มักจะมีช่วงของเครื่อง POSIX อื่น ๆ ที่bash
เรือในสถานที่ต่างๆเช่นหรือ/usr/xpg/bin/bash
/usr/local/bin/bash
ในการเขียนสคริปต์ทุบตีแบบพกพาเราจึงไม่สามารถbash
เชื่อถือตำแหน่งของโปรแกรมได้อย่างหนัก POSIX PATH
แล้วมีกลไกในการจัดการกับว่า: แนวคิดคือคุณติดตั้งโปรแกรมของคุณในหนึ่งในไดเรกทอรีที่อยู่ในPATH
และระบบควรจะสามารถค้นหาโปรแกรมของคุณเมื่อคุณต้องการเรียกใช้โดยใช้ชื่อ
น่าเศร้าที่คุณไม่สามารถทำสิ่งนี้ได้:
#!bash
เคอร์เนลจะไม่PATH
ค้นหาข้อมูลสำหรับคุณ มีโปรแกรมที่สามารถทำได้คือPATH
การค้นหาสำหรับคุณ env
แต่ก็เรียกว่า โชคดีที่เกือบทุกระบบมีโปรแกรมที่ติดตั้งในenv
/usr/bin
ดังนั้นเราจึงเริ่มenv
ใช้เส้นทางฮาร์ดโค้ดซึ่งจะPATH
ทำการค้นหาbash
และเรียกใช้เพื่อให้สามารถตีความสคริปต์ของคุณ:
#!/usr/bin/env bash
วิธีการนี้มีหนึ่งข้อเสีย: ตาม POSIX, hashbang สามารถมีหนึ่งอาร์กิวเมนต์ ในกรณีนี้เราใช้bash
เป็นอาร์กิวเมนต์ของenv
โปรแกรม นั่นหมายความว่าเราไม่มีช่องว่างเหลือที่จะผ่านการโต้แย้งไปbash
ได้ ดังนั้นจึงไม่มีวิธีที่จะแปลงอะไรที่คล้าย#!/bin/bash -exu
กับโครงการนี้ คุณต้องใส่set -exu
hashbang แทน
วิธีการนี้มีข้อดีอีกอย่างคือ: ระบบบางระบบอาจมาพร้อมกับ a /bin/bash
แต่ผู้ใช้อาจไม่ชอบมันอาจพบว่าเป็นรถบั๊กซีหรือล้าสมัยและอาจติดตั้งเองที่bash
อื่น กรณีนี้มักเกิดขึ้นใน OS X (Macs) ซึ่ง Apple จัดส่งเครื่องล้าสมัย/bin/bash
และผู้ใช้ติดตั้งรุ่นล่าสุด/usr/local/bin/bash
โดยใช้บางอย่างเช่น Homebrew เมื่อคุณใช้env
วิธีการที่ทำการPATH
ค้นหาคุณจะต้องคำนึงถึงความพึงพอใจของผู้ใช้และใช้การทุบตีที่เขาต้องการมากกว่าระบบที่เขาจัดส่ง
zsh
เป็นเปลือกของฉันฉันจะใช้hashbang
#! /usr/bin/env zsh
?
#! /usr/bin/env zsh
ถ้า (และเฉพาะในกรณีที่) โค้ดภายในสคริปต์ควรถูกเรียกใช้โดย Z เชลล์
ในการเริ่มเชลล์ - สคริปต์ 'file.sh':
sh file.sh
bash file.sh
อีกตัวเลือกหนึ่งคือตั้งค่าอนุญาตให้ใช้สิทธิได้โดยใช้คำสั่ง chmod
chmod +x file.sh
ตอนนี้เรียกใช้ไฟล์. sh ดังนี้
./file.sh
สำหรับเปลือก bourne:
sh myscript.sh
สำหรับทุบตี:
bash myscript.sh
หากคุณต้องการให้สคริปต์ทำงานในเชลล์ปัจจุบัน (เช่นคุณต้องการให้สคริปต์ส่งผลต่อไดเรกทอรีหรือสภาพแวดล้อมของคุณ) คุณควรพูดว่า:
. /path/to/script.sh
หรือ
source /path/to/script.sh
โปรดทราบว่า/path/to/script.sh
สามารถเป็นญาติตัวอย่างเช่น. bin/script.sh
ทำงานscript.sh
ในbin
ไดเรกทอรีภายใต้ไดเรกทอรีปัจจุบัน
ก่อนอื่นให้อนุญาตสำหรับการดำเนินการ: -
chmod +x script_name
sh script_name
bash script_name
./script_name
หมายเหตุ : คุณสามารถตรวจสอบว่าไฟล์นั้นสามารถเรียกใช้งานได้หรือไม่โดยใช้ 'ls -a'
นามสกุลไฟล์คำสั่งถูกกำหนดให้กับ Terminal.app การดับเบิลคลิกที่ไฟล์คำสั่งใด ๆ จะดำเนินการ
นอกจากนี้เล็กน้อยเพื่อเรียกใช้ล่ามจากโฟลเดอร์เดียวกันยังคงใช้#! hashbangในสคริปต์
ตัวอย่างเช่นไฟล์ปฏิบัติการ php7.2 ที่คัดลอกมาจาก/ usr / binอยู่ในโฟลเดอร์พร้อมกับสคริปต์สวัสดี
#!./php7.2
<?php
echo "Hello!";
วิธีเรียกใช้:
./hello
ซึ่งมีพฤติกรรมเท่ากับ:
./php7.2 hello