คำถามติดแท็ก shebang

ใช้แท็ก / shebang หากคำถามของคุณเกี่ยวกับ `#! '-string ที่จุดเริ่มต้นของสคริปต์

9
ทำไมจึงควรใช้“ #! / usr / bin / env NAME” แทนที่จะเป็น“ #! / path / to / NAME” เป็น shebang ของฉัน
ผมสังเกตเห็นว่าบางสคริปต์ที่ฉันได้รับจากคนอื่น ๆ มี shebang #!/path/to/NAMEขณะที่คนอื่น (โดยใช้เครื่องมือเดียวกัน NAME) มี #!/usr/bin/env NAMEshebang ทั้งคู่ดูเหมือนจะทำงานอย่างถูกต้อง ในบทช่วยสอน (บน Python) ดูเหมือนจะมีข้อเสนอแนะว่า Shebang หลังดีกว่า แต่ฉันไม่เข้าใจว่าทำไมจึงเป็นเช่นนี้ ฉันรู้ว่าเพื่อที่จะใช้ Shebang หลัง NAME จะต้องอยู่ในเส้นทางในขณะที่ Shebang แรกไม่มีข้อ จำกัด นี้ นอกจากนี้ยังปรากฏว่าสำหรับฉันคนแรกจะดีกว่า shebang เพราะมันระบุได้อย่างแม่นยำว่าที่ใดที่ NAME ตั้งอยู่ ดังนั้นในกรณีนี้หากมี NAME หลายเวอร์ชัน (เช่น / usr / bin / NAME, / usr / local / bin / NAME) …


5
shebang พิจารณาเชลล์ที่รันสคริปต์หรือไม่
นี่อาจเป็นคำถามที่โง่ แต่ฉันก็ยังถาม ถ้าฉันได้ประกาศ shebang #!/bin/bash ในตอนต้นของmy_shell_script.shฉันจะต้องเรียกใช้สคริปต์นี้โดยใช้ทุบตี [my@comp]$bash my_shell_script.sh หรือฉันสามารถใช้เช่น [my@comp]$sh my_shell_script.sh และสคริปท์ของฉันกำหนดเชลล์ที่กำลังใช้งานอยู่โดยใช้ shebang? มันเกิดขึ้นเหมือนกันกับkshเชลล์ไหม? ฉันใช้ AIX

8
#! / bin / bash - ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
ฉันสร้างสคริปต์ทุบตี แต่เมื่อฉันพยายามเรียกใช้งานฉันจะได้รับ #!/bin/bash no such file or directory ฉันต้องการเรียกใช้คำสั่ง: bash script.shเพื่อให้สามารถใช้งานได้ ฉันจะแก้ไขสิ่งนี้ได้อย่างไร

3
Shebang เริ่มต้นด้วย `// '?
ฉันสับสนเกี่ยวกับการติดตามสคริปต์ ( hello.go) //usr/bin/env go run $0 $@ ; exit package main import "fmt" func main() { fmt.Printf("hello, world\n") } มันสามารถดำเนินการ (บน MacOS X 10.9.5) $ chmod +x hello.go $ ./hello.go hello, world ฉันไม่เคยได้ยินเกี่ยวกับ shebang //มาก่อนเลย และมันก็ยังทำงานได้เมื่อฉันแทรกบรรทัดว่างที่ด้านบนของสคริปต์ เหตุใดสคริปต์นี้จึงทำงาน

6
มีเหตุผลใดบ้างที่จะต้องมี shebang ชี้ไปที่ / bin / sh แทนที่จะเป็น / bin / bash?
ในส่วนเชลล์สคริปต์ที่ผมเคยเห็น (นอกเหนือจากคนที่ฉันไม่ได้เขียนตัวเอง) ผมสังเกตเห็นว่า shebang #!/bin/shมีการตั้งค่า นี่ไม่ได้ทำให้ฉันแปลกใจกับสคริปต์เก่า ๆ แต่มันก็มีสคริปต์ใหม่ ๆ มีเหตุผลในการเลือก/bin/shมากกว่า/bin/bashเนื่องจากbashแพร่หลายมากและมักจะเริ่มต้นในเครื่อง Linux และ BSD จำนวนมากจะกลับมาดีกว่าทศวรรษ?
53 bash  shell  history  shebang 

2
อนุญาตให้มีช่องว่างระหว่าง #! และ / bin / bash ใน shebang?
ใน Shebang มีช่องว่างหรือมากกว่านั้นระหว่าง#!และกับล่ามหรือไม่ ตัวอย่างเช่น#! /bin/bash. ดูเหมือนว่าจะใช้งานได้ แต่บางคนก็บอกว่ามันไม่ถูกต้อง
47 shebang 

2
ใช้. sh หรือ. bash extension สำหรับสคริปต์ทุบตี?
(ดูการใช้ #! / bin / sh หรือ #! / bin / bash สำหรับความเข้ากันได้ของ Ubuntu-OSX และใช้งานง่าย & POSIX ) ถ้าฉันต้องการให้สคริปต์ของฉันใช้ bash shell ให้ใช้ส่วนขยาย. bash จริง ๆ แล้วเรียกใช้ bash หรือขึ้นอยู่กับ system config / 1st shebang line หากทั้งคู่มีผล แต่แตกต่างกันซึ่งจะมีความสำคัญกว่ากัน ฉันไม่แน่ใจว่าจะจบสคริปต์ด้วย. sh เพียงแค่ระบุ "shell script" จากนั้นให้บรรทัดแรกเลือก bash shell (เช่น#!/usr/bin/env bash) หรือว่าจะจบด้วยbash (เช่นเดียวกับการตั้งค่าบรรทัด 1) ) …
36 bash  shell  shebang 

4
จะเกิดอะไรขึ้นเมื่อฉันเรียกใช้ไฟล์ในเชลล์
ดังนั้นฉันคิดว่าฉันมีความเข้าใจที่ดีในเรื่องนี้ แต่เพียงแค่ทดสอบ (เพื่อตอบสนองต่อการสนทนาที่ฉันไม่เห็นด้วยกับใครบางคน) และพบว่าความเข้าใจของฉันมีข้อบกพร่อง ... ในรายละเอียดมากที่สุดจะเกิดอะไรขึ้นเมื่อฉันเรียกใช้ไฟล์ในเชลล์? สิ่งที่ฉันหมายถึงคือถ้าฉันพิมพ์: ./somefile some argumentsลงในเปลือกของฉันและกดย้อนกลับ (และsomefileมีอยู่ใน cwd และฉันได้อ่าน + ดำเนินการสิทธิ์บนsomefile) แล้วเกิดอะไรขึ้นภายใต้ประทุน? ฉันคิดว่าคำตอบคือ: เปลือกทำ syscall ให้execผ่านเส้นทางไปsomefile เคอร์เนลตรวจสอบsomefileและดูหมายเลขมายากลของไฟล์เพื่อตรวจสอบว่าเป็นรูปแบบที่โปรเซสเซอร์สามารถจัดการได้หรือไม่ หากหมายเลขมายากลระบุว่าไฟล์อยู่ในรูปแบบที่โปรเซสเซอร์สามารถใช้งานได้ กระบวนการใหม่ถูกสร้างขึ้น (โดยมีรายการในตารางกระบวนการ) somefileถูกอ่าน / แมปกับหน่วยความจำ สแต็กถูกสร้างขึ้นและการดำเนินการข้ามไปยังจุดเริ่มต้นของรหัสsomefileโดยARGVเริ่มต้นไปที่อาร์เรย์ของพารามิเตอร์ (a char**, ["some","arguments"]) หากจำนวนมายากลเป็นshebangแล้วexec()spawns กระบวนการใหม่ดังกล่าวข้างต้น แต่ปฏิบัติการที่ใช้เป็นล่ามอ้างอิงโดย shebang (เช่น/bin/bashหรือ/bin/perl) และsomefileถูกส่งไปยังSTDIN หากไฟล์ไม่มีหมายเลขเวทย์มนตร์ที่ถูกต้องแสดงว่ามีข้อผิดพลาดเช่น "ไฟล์ไม่ถูกต้อง (หมายเลขเวทย์มนตร์ที่ไม่ดี): เกิดข้อผิดพลาดในรูปแบบ Exec" อย่างไรก็ตามมีคนบอกฉันว่าถ้าไฟล์เป็นข้อความธรรมดาเชลล์จะพยายามเรียกใช้คำสั่ง (เช่นถ้าฉันพิมพ์bash somefile) ฉันไม่เชื่อเรื่องนี้ แต่ฉันแค่ลองมันและมันก็ถูกต้อง ดังนั้นฉันจึงมีความเข้าใจผิดอย่างชัดเจนเกี่ยวกับสิ่งที่เกิดขึ้นจริงที่นี่และต้องการที่จะเข้าใจกลไก จะเกิดอะไรขึ้นเมื่อฉันเรียกใช้ไฟล์ในเชลล์ (ในรายละเอียดมากพอสมควร …
32 shell  kernel  exec  shebang 

7
มีการโต้แย้งหลายครั้งใน shebang
ฉันสงสัยว่ามีวิธีทั่วไปในการส่งตัวเลือกหลายตัวไปยังโปรแกรมที่เรียกใช้งานได้ผ่านทางสาย shebang ( #!) ผมใช้ NixOS และส่วนแรกของ shebang ในสคริปต์ใด ๆ /usr/bin/envที่ฉันเขียนมักจะ ปัญหาที่ฉันพบคือทุกสิ่งที่เกิดขึ้นหลังจากนั้นถูกตีความว่าเป็นไฟล์หรือไดเรกทอรีเดียวโดยระบบ ตัวอย่างเช่นสมมติว่าฉันต้องการเขียนสคริปต์ที่จะดำเนินการโดยbashในโหมด posix วิธีที่ไร้เดียงสาของการเขียน Shebang จะเป็น: #!/usr/bin/env bash --posix แต่พยายามที่จะรันสคริปต์ผลลัพธ์จะสร้างข้อผิดพลาดต่อไปนี้: /usr/bin/env: ‘bash --posix’: No such file or directory ฉันทราบเกี่ยวกับโพสต์นี้แต่ฉันสงสัยว่ามีวิธีการทั่วไปที่สะอาดกว่าหรือไม่ แก้ไข : ฉันรู้ว่าสำหรับสคริปต์Guileมีวิธีการบรรลุสิ่งที่ฉันต้องการบันทึกไว้ในส่วน 4.3.4ของคู่มือ: #!/usr/bin/env sh exec guile -l fact -e '(@ (fac) main)' -s "$0" "$@" !# เคล็ดลับที่นี่ก็คือบรรทัดที่สอง (เริ่มต้นด้วยexec) …

1
ที่สัญญาณหลังจาก shebang?
ในสคริปต์ "support / apxs.in" ของ Apache httpdข้อความที่ล้อมรอบด้วย@เครื่องหมายจะปรากฏขึ้นหลังจาก#!นั้น นั่นคือบรรทัดแรกของสคริปต์คือ: #!@perlbin@ -w นี่คือสิ่ง Perl หรือสิ่งเคอร์เนล UNIX? กล่าวอีกนัยหนึ่งเป็นไปได้ไหมที่จะเรียกใช้สคริปต์นี้โดยใช้path/to/script/script_name.in? ถ้าไม่เช่นนั้นมีเหตุผลอะไรที่จะเริ่มสคริปต์ด้วย#!?

3
เรียกใช้สคริปต์ในหน้าจอ
ฉันต้องการรันสคริปต์ทุบตีในหน้าจอเดี่ยว สคริปต์เรียกโปรแกรมสองสามครั้งแต่ละอันใช้เวลาในการรอนานเกินไป ความคิดแรกของฉันคือเพียงเปิดหน้าจอจากนั้นเรียกสคริปต์ แต่ดูเหมือนว่าฉันจะแยกออกไม่ได้ (โดยctrl-a d) ในขณะที่สคริปต์ทำงานอยู่ ดังนั้นฉันจึงทำการวิจัยและพบคำแนะนำนี้เพื่อแทนที่ shebang ด้วยต่อไปนี้: #!/usr/bin/screen -d -m -S screenName /bin/bash แต่นั่นไม่ได้ผลเช่นกัน (ตัวเลือกไม่ได้รับการยอมรับ) ข้อเสนอแนะใด ๆ ป.ล. เกิดขึ้นกับฉันในตอนนี้ซึ่งscreen -dmS name ./script.shอาจเป็นไปได้สำหรับวัตถุประสงค์ของฉัน แต่ฉันก็ยังสงสัยว่าจะรวมสิ่งนี้เข้ากับสคริปต์อย่างไร ขอขอบคุณ.

5
แนะนำให้ใช้ zsh แทนที่จะเป็นสคริปต์ทุบตีหรือไม่? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิด4 วันที่ผ่านมา ฉันสามารถสันนิษฐานได้ว่ามีคนจำนวนมากพอที่จะzshติดตั้งเพื่อรันสคริปต์ด้วย #!/usr/bin/env zsh ในฐานะ shebang? หรือสิ่งนี้จะทำให้สคริปต์ของฉันไม่สามารถทำงานได้บนระบบมากเกินไปหรือไม่ ชี้แจง: ฉันสนใจโปรแกรม / สคริปต์ที่ผู้ใช้อาจต้องการเรียกใช้ (เช่นบน Ubuntu, Debian, SUSE, Arch & c.)


4
ทำไมไม่มี shebang ใน. bashrc / .bash_profile
การสืบค้นง่าย ๆ : ฉันเพิ่งรู้ว่าฉันไม่เคยเห็นshebangทับ.bashrcสคริปต์ซึ่งทำให้ฉันคิดว่าระบบใช้เชลล์เริ่มต้นเพื่อหามันเมื่อล็อกอิน ( ${SHELL}) ฉันกำลังไตร่ตรองถึงสาเหตุที่เป็นเช่นนั้นคือมันถือว่าเป็นนิสัยที่ไม่ดีที่จะใช้สิ่งอื่นนอกเหนือจากเชลล์เริ่มต้นเพื่อเรียกใช้สคริปต์การเข้าสู่ระบบ

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