เครื่องหมายแอมเปอร์แซนด์หมายถึงอะไรในตอนท้ายของเชลล์สคริป


118
sh sys-snap.sh &

คือshอะไร คือsys-snap.shอะไร ทำไมฉันถึงต้องวางไว้&ที่ท้ายบรรทัด? ทุกคนสามารถอธิบายไวยากรณ์ได้หรือไม่

โดยไม่ต้อง&สคริปต์ที่จะไม่กลับไปที่พรอมต์จนฉันกด+Ctrl Cด้วย&ฉันสามารถกด Enter และใช้งานได้


2
เครื่องหมายแอมเปอร์แซนด์คู่&&ต่างจากแอมเปอร์แซนด์เดี่ยว&หรือไม่
Charlie Parker

1
@CharlieParker คุณเคยพบคำตอบหรือเปล่า? ฉันพยายามหาความแตกต่างด้วยตัวเอง (แก้ไข: ไม่เป็นไรพบมันต่อไป)
Drazen Bjelovuk

คำตอบ:


94

shเป็นเชลล์เริ่มต้นที่เข้ากันได้กับ Bourne (โดยปกติแล้วจะเป็น bash หรือ dash)

sys-snap.shเป็นเชลล์สคริปต์ซึ่งมีคำสั่งที่shดำเนินการ เมื่อคุณไม่โพสต์เนื้อหาฉันสามารถเดาได้จากชื่อของมันคืออะไร ฉันสามารถค้นหาสคริปต์ที่เกี่ยวข้องกับ CPanel ด้วยชื่อไฟล์เดียวกันที่สร้างล็อกไฟล์ด้วยกระบวนการปัจจุบันทั้งหมดการใช้หน่วยความจำปัจจุบันสถานะฐานข้อมูล ฯลฯ หากสคริปต์เริ่มต้นด้วยบรรทัด Shebang ( #!/bin/shหรือคล้ายกัน) คุณสามารถทำให้สามารถเรียกใช้งานได้ ด้วยchmod +x sys-snap.shและเริ่มต้นโดยตรงโดยใช้./sys-snap.shถ้ามันอยู่ในไดเรกทอรีปัจจุบัน

เมื่อ&กระบวนการเริ่มต้นในพื้นหลังดังนั้นคุณสามารถใช้เชลล์ต่อไปและไม่ต้องรอจนกว่าสคริปต์จะเสร็จสิ้น หากคุณลืมคุณสามารถหยุดกระบวนการทำงานปัจจุบันด้วยCtrl-Zและดำเนินการต่อในพื้นหลังด้วย bg(หรือในเบื้องหน้าด้วยfg) สำหรับข้อมูลเพิ่มเติมดูการควบคุมงาน


4
shมักจะมีเพียงในbashหรือdashในระบบ Linux (หรือล่าสุด OS / X) ตาม ใน BSD นั้นโดยปกติแล้วจะแตกต่างจาก Ash (เส้นประขึ้นอยู่กับ NetBSD sh ตัวเองตาม Almquist Shell) หรืออนุพันธ์ pdksh ใน Unices เชิงพาณิชย์ทั่วไปคือ ksh88
Stéphane Chazelas

1
@jofel: จะเกิดอะไรขึ้นถ้าสคริปต์ด้านล่างทำงานและผิดฉันได้ใช้งาน Ctrl-C สคริปต์ของฉันจะทำงานหรือไม่หรือจะถูกยกเลิก ตัวอย่าง: sh sys-snap.sh &
Hussain7

2
@ Hussain7 Ctrl-C จะถูกส่งไปยังกระบวนการปัจจุบันในเบื้องหน้าเสมอ หากเชลล์สคริปต์เริ่มต้นด้วย&ดังนั้นในพื้นหลังคุณจะได้รับพรอมต์เชลล์ใหม่เท่านั้น
59

2
เครื่องหมายแอมเปอร์แซนด์คู่&&ต่างจากแอมเปอร์แซนด์เดี่ยว&หรือไม่
Charlie Parker

7
@CharlieParker ใช่ "&&" คือฟังก์ชัน "และ" คำสั่งหลังจาก && เรียกว่าเมื่อคำสั่งก่อนสำเร็จ ตัวอย่าง "true && echo works" output "ใช้งานได้ แต่" false && echo no output "ไม่ได้เรียกฟังก์ชัน echo
jofel

87

เรื่องนี้เป็นที่รู้จักกันในนามjob controlยูนิกซ์ &แจ้งเปลือกที่จะนำคำสั่งในพื้นหลัง นี่หมายความว่ามันยังคงรันsys-snap.shคำสั่ง แต่ส่งคุณกลับไปที่เชลล์เพื่อให้คุณทำคำสั่งแบบขนานต่อไป

คุณสามารถดูรายการงานที่กำลังรันด้วยjobsคำสั่ง คุณสามารถกลับไปที่คำสั่ง (นำมาที่หน้า ') ด้วยการใช้fgคำสั่ง ซึ่งดึงคำสั่งกลับสู่สถานะที่คุณไม่เห็นพรอมต์และคุณต้องออกCtrl- Cเพื่อฆ่ากระบวนการ แต่คุณสามารถระงับ (หยุด) กระบวนการที่ออก-Ctrl Zการดำเนินการนี้จะหยุดชั่วคราวsys-snap.shและกลับสู่พรอมต์ของคุณ จากนั้นคุณสามารถพื้นหลัง (รวมแม้ว่าคุณจะได้ออกมันมี& ) กับbgคำสั่งและมันจะกลับมาวิ่งออกมาจากมันหยุดชั่วคราวรัฐCtrl- Zได้ใส่ไว้ใน

โปรดทราบว่าคุณสามารถมีงานได้มากกว่าหนึ่งงานในแต่ละครั้ง (ดังที่แสดงโดยjobs):

[1]-  Running          sys-snap.sh &
[2]+  Running          another-script.sh &

คุณสามารถพื้นหลังและเบื้องหน้าพวกเขาโดยใช้หมายเลขงานของพวกเขา%1จะเป็นsys-snap.shและจะเป็น%2 another-script.shหากคุณใช้fgหรือbgไม่ใช้อาร์กิวเมนต์มันจะดำเนินการคำสั่งในงานที่ทำเครื่องหมายโดย+ในjobsผลลัพธ์ด้านบน

fg %1

จะใส่sys-snap.shกลับไปที่พื้นหน้าในขณะที่ทิ้งไว้another-script.shในพื้นหลัง

คุณสามารถออกCtrl- Cลำดับการดำเนินงานได้โดยไม่ต้องเบื้องหน้าพวกเขาด้วยkillคำสั่งkill %1จะส่งเทียบเท่าของCtrl- ไปCsys-snap.sh

หากคุณกำลังใช้ bash shell man bashคำสั่งจะมีส่วนที่มีรายละเอียดอยู่ภายใต้หัวข้อ 'JOB CONTROL' เพื่อดูรายละเอียดเพิ่มเติม

สำหรับชื่อsys-snap.shภายใต้ชื่อไฟล์ unix นั้นเป็นกฎเกณฑ์ (โดยมีข้อยกเว้นสองสามประการเช่นไฟล์ตัวโหลดแบบไดนามิก) ไม่มีข้อกำหนดสำหรับพวกเขาที่จะมีขอบเขตไฟล์ที่เฉพาะเจาะจงเพื่อให้พวกเขาทำงานเป็นเชลล์สคริปต์เรียกคำสั่งอื่น ๆ เช่นperlหรือphpอื่น ๆ มันมักจะใช้เพื่อให้ความชัดเจนว่าในกรณีนี้มันเป็น.shเชลล์สคริปต์โดยใช้บอร์นเชลล์/bin/sh.

ส่วนการทำงานของsys-snap.sh(เมื่อคุณดูที่เนื้อหาของมันมีบางสิ่งบางอย่างเช่นlessคำสั่ง) เป็นshebang ในบรรทัดแรกคุณอาจพบหนึ่งใน:

#! /bin/sh
#! /bin/bash
#! /usr/local/bin/bash

หรือคล้ายกัน โดยพื้นฐานแล้วคำสั่งหลังจากนั้น#!(เช่น/bin/sh) จะถูกรันและเนื้อหาของไฟล์สคริปต์ที่เหลือจะถูกป้อนเข้าบรรทัดในแต่ละครั้ง โปรดทราบว่าไฟล์จะต้องตั้งค่าปฏิบัติการด้วยchmodเพื่อให้คุณสามารถเรียกใช้เป็นคำสั่ง หากไม่ได้ตั้งค่าการอนุญาตสิทธิ์จะshebangไม่มีผลเพราะคุณอาจได้รับข้อผิดพลาด:

bash: sys-snap.sh: command not found

หรือถ้าคุณวิ่งตามเส้นทางที่ชัดเจน./sys-snap.sh( .หมายถึงไดเรกทอรีการทำงานปัจจุบัน) คุณจะได้รับ:

bash: ./sys-snap.sh: Permission denied

อีกทางเลือกหนึ่งคือปล่อยไว้โดยไม่มีการอนุญาตและขอให้ / bin / sh เรียกใช้อย่างชัดเจน:

/bin/sh sys-snap.sh &

3
นี่คือคำตอบที่ดี ข้อเสนอแนะที่เป็นไปได้อย่างหนึ่งคือการเพิ่มสิ่งที่nohupทำเช่นนั้นบ่อยครั้งที่มันใช้ร่วมกับ&เพื่อเริ่มกระบวนการและสามารถฆ่าเชลล์ที่เปิดใช้โดยไม่ฆ่ากระบวนการ
Tommy

@Drav มันเป็นความจริงแล้วมันjobsจะว่างเปล่าเสมอถ้ามันเป็นคำสั่งแรก
Pacerier

โปรดทราบว่าการใช้&คำสั่งที่ส่วนท้ายของคำสั่งจะแยกเฉพาะstdin(แต่ไม่ใช่stdoutหรือstderr) ซึ่งหมายถึงว่าคำสั่ง / สคริปต์ของคุณกำลังทำงานในพื้นหลัง แต่เขียนถึงstdoutคุณอาจทำงานในสถานการณ์ที่Ctrl + cจะไม่หยุดเอาต์พุต แต่คุณจะสามารถ เพื่อพิมพ์คำสั่ง นี่เป็นเพราะกระบวนการพื้นหลังกำลังเขียนถึงstdoutแต่คุณไม่สามารถหยุดได้เพราะมันไม่ได้ทำงานในเบื้องหน้า ข้อมูลเพิ่มเติมที่นี่
vadasambar

4

shเป็นเปลือก เปลือกใดขึ้นอยู่กับระบบ ตัวอย่างสำหรับระบบที่ใช้bashเป็นเชลล์มาตรฐาน:

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 13 16:12 /bin/sh -> bash

$ sh --version
GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu)

sys-snap.shจะเป็นเชลล์สคริปต์บางชนิดดังนั้นsh sys-snap.shจะรันเชลล์สคริปต์

&จะทำให้กระบวนการเชลล์ทำงานในพื้นหลัง หากไม่มี&มันจะอยู่ในเบื้องหน้าจนกว่าสคริปต์จะจบ สคริปต์ทำงานได้ทั้งสองวิธีมันเป็นเพียงคำถามที่รอให้สคริปต์หยุดทำงานหรือไม่ก่อนที่จะดำเนินการคำสั่งเพิ่มเติม


1

เซิร์ฟเวอร์ของคุณอยู่ใน hostgator หรือไม่?

สคริปต์sys-snap.shเป็นสคริปต์พิเศษที่เขียนโดยทีมงานโฮสต์เพื่อรวบรวมไฟล์บันทึกและข้อมูลทั้งหมดสำหรับระบบดังนั้นจึงใช้เอาต์พุตในการตรวจสอบและรวบรวมข้อมูลระบบ


ไม่ฉันไม่ได้ใช้ hostgator
user4951

1
@ J.Chang สคริปต์เป็นส่วนหนึ่งของ cPanel ซึ่ง Hostgator และโฮสต์อื่น ๆ นับร้อยใช้
472084

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