Ampersand có nghĩa là gì ở cuối dòng script shell?


118
sh sys-snap.sh &

shgì Là sys-snap.shgì Tại sao tôi nên đặt &ở cuối dòng? Bất cứ ai có thể giải thích cú pháp?

Nếu không có đoạn &script sẽ không quay lại dấu nhắc cho đến khi tôi nhấn Ctrl+ C. Với &tôi có thể nhấn enter và nó hoạt động.


2
ampersand đôi có &&khác với một ampersand &không?
Charlie Parker

1
@CharlieParker Bạn đã bao giờ tìm thấy câu trả lời cho điều đó chưa? Tôi đang cố gắng tìm ra sự khác biệt bản thân mình. (Chỉnh sửa: Nevermind, tìm thấy nó xuống sâu hơn)
Drazen Bjelovuk

Câu trả lời:


94

shlà trình bao tương thích Bourne mặc định (thường là bash hoặc dash)

sys-snap.shlà một kịch bản shell, chứa các lệnh shthực thi. Khi bạn không đăng nội dung của nó, tôi chỉ có thể đoán từ tên của nó, nó làm gì. Tôi có thể tìm thấy tập lệnh liên quan đến CPanel có cùng tên tệp, tạo tập tin nhật ký với tất cả các quy trình hiện tại, sử dụng bộ nhớ hiện tại, trạng thái cơ sở dữ liệu, v.v ... Nếu tập lệnh bắt đầu bằng một dòng shebang ( #!/bin/shhoặc tương tự), bạn có thể làm cho nó có thể thực thi được với chmod +x sys-snap.shvà bắt đầu trực tiếp bằng cách sử dụng ./sys-snap.shnếu nó nằm trong thư mục hiện tại.

Với &quá trình bắt đầu trong nền, vì vậy bạn có thể tiếp tục sử dụng trình bao và không phải đợi cho đến khi tập lệnh kết thúc. Nếu bạn quên nó, bạn có thể dừng quá trình chạy hiện tại với Ctrl-Zvà tiếp tục nó trong nền với bg(hoặc ở nền trước với fg). Để biết thêm thông tin, xem kiểm soát công việc


4
shthường chỉ bashhoặc dashtrong các hệ thống dựa trên Linux (hoặc OS / X gần đây). Trên BSD, thường là một biến thể khác của Ash (dấu gạch ngang dựa trên NetBSD sh, chính nó dựa trên Almquist Shell) hoặc một dẫn xuất pdksh. Trên Unices thương mại, thường là ksh88.
Stéphane Chazelas

1
@jofel: Điều gì xảy ra nếu đoạn script dưới đây đang chạy và do nhầm lẫn tôi đã thực thi Ctrl-C. Kịch bản của tôi sẽ thực thi hay nó sẽ bị chấm dứt? Vd: sh sys-snap.sh &
Hussain7

2
@ Hussain7 Ctrl-C luôn được gửi đến quy trình hiện tại ở nền trước. Nếu shell-script được bắt đầu &và do đó trong nền, bạn chỉ nhận được một dấu nhắc shell mới.
jofel

2
ampersand đôi có &&khác với một ampersand &không?
Charlie Parker

7
@CharlieParker Có, "&&" là chức năng "và". Lệnh sau && chỉ được gọi khi lệnh trước thành công. Ví dụ "true && echo works" output "hoạt động, nhưng" false && echo no output "không gọi hàm echo.
jofel

87

Điều này được gọi là job controldưới unix. Các &thông báo cho shell để đặt lệnh trong nền. Điều này có nghĩa là nó tiếp tục chạy sys-snap.shlệnh nhưng trả bạn về trình bao của bạn để cho phép bạn tiếp tục thực hiện các lệnh song song.

Bạn có thể thấy danh sách các công việc hiện đang chạy bằng jobslệnh. Bạn có thể quay lại lệnh (đưa đến 'tiền cảnh) bằng cách sử dụng fglệnh. Điều này kéo lệnh trở lại trạng thái mà bạn không thấy dấu nhắc nào và bạn phải đưa ra Ctrl- Cđể giết tiến trình. Tuy nhiên, bạn có thể tạm dừng (tạm dừng) quá trình đó, ban hành Ctrl- Z. Điều này sẽ tạm dừng sys-snap.shvà đưa bạn trở lại lời nhắc của bạn. Bạn có thể sau đó nền nó (như thể bạn đã phát hành nó với các &) với bglệnh, và nó sẽ tiếp tục chạy từ nó dừng lại nhà nước Ctrl- Zđã đặt nó trong.

Lưu ý rằng bạn có thể có nhiều công việc cùng một lúc (như được hiển thị bởi jobs):

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

Bạn có thể làm nền và tiền cảnh cho họ bằng cách sử dụng số công việc của họ, %1sẽ sys-snap.sh%2sẽ another-script.sh. Nếu bạn sử dụng fghoặc bgkhông có đối số, nó sẽ thực hiện lệnh trên công việc được đánh dấu bởi +trong jobsđầu ra ở trên.

fg %1

sẽ đưa sys-snap.shtrở lại vào nền trước, trong khi để lại another-script.shtrong nền.

Bạn có thể đưa ra chuỗi Ctrl- Cđể chạy các công việc mà không cần phải tạo tiền đề cho chúng bằng killlệnh, kill %1sẽ gửi tương đương Ctrl- Cđến sys-snap.sh.

Nếu bạn đang sử dụng bash shell, man bashlệnh có một phần chi tiết bên dưới phần có tiêu đề 'KIỂM SOÁT CÔNG VIỆC' sẽ đi sâu vào chi tiết hơn.

Đối với tên của sys-snap.sh, dưới tên tệp unix là tùy ý (với một vài ngoại lệ như tệp trình tải động). Không có yêu cầu nào để chúng có phạm vi tệp cụ thể để làm cho chúng chạy như một tập lệnh shell, gọi các lệnh khác như perlhoặc phpv.v. Nó thường được sử dụng để cung cấp sự rõ ràng, trong trường hợp này, đó là .shShell Script sử dụng Bourne Shell /bin/sh.

Phần chức năng của sys-snap.sh(khi bạn xem nội dung của nó bằng một cái gì đó giống như lesslệnh) là Shebang . Trên dòng đầu tiên, bạn có thể sẽ tìm thấy một trong:

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

hoặc tương tự. Trong các điều khoản cơ bản, một lệnh sau khi #!(chẳng hạn như /bin/sh) được chạy và nội dung của phần còn lại của tệp tập lệnh được đưa đến một dòng tại một thời điểm. Lưu ý rằng tập tin cũng phải được thiết lập để thực thi chmodđể bạn có thể chạy nó dưới dạng một lệnh. Nếu quyền không được đặt, thì quyền đó shebangkhông có hiệu lực, vì bạn sẽ gặp lỗi:

bash: sys-snap.sh: command not found

hoặc nếu bạn chạy nó bằng đường dẫn rõ ràng ./sys-snap.sh( .có nghĩa là thư mục làm việc hiện tại) bạn sẽ nhận được:

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

Cách khác là để lại nó mà không thực thi quyền và yêu cầu / bin / sh rõ ràng để chạy nó:

/bin/sh sys-snap.sh &

3
đây là một câu trả lời tuyệt vời một đề nghị có thể là cũng thêm vào những gì nohup, vì nó thường được sử dụng cùng với &để bắt đầu một quá trình và có thể giết chết lớp vỏ đã khởi chạy nó mà không làm chết quá trình.
Tommy

@Drav, Có đúng vậy không, nó jobssẽ luôn trả về sản phẩm nào nếu là lệnh đầu tiên?
Pacerier

Lưu ý rằng việc sử dụng &ở cuối lệnh chỉ tách ra stdin(nhưng không stdouthoặc stderr) có nghĩa là nếu lệnh / tập lệnh của bạn đang chạy trong nền nhưng viết vào stdout, bạn có thể gặp phải tình huống Ctrl + csẽ không dừng đầu ra nhưng bạn sẽ có thể để gõ các lệnh. Điều này là do quá trình nền được ghi vào stdoutnhưng bạn không thể dừng nó vì nó không chạy ở nền trước. Thêm thông tin ở đây .
vadasambar

4

shlà một cái vỏ. Vỏ nào chính xác phụ thuộc vào hệ thống. Ví dụ cho một hệ thống sử dụng bashlàm vỏ tiêu chuẩn của nó:

$ 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.shsẽ là một kịch bản shell của một số loại, vì vậy sh sys-snap.shsẽ thực thi kịch bản shell.

&sẽ làm cho quá trình shell chạy trong nền. Không có &nó sẽ ở trong nền trước cho đến khi kịch bản kết thúc. Kịch bản sẽ hoạt động theo cách nào đó, đó chỉ là một câu hỏi chờ đợi kịch bản kết thúc hay không trước khi thực hiện các lệnh tiếp theo.


1

Là máy chủ của bạn trong hostgator?

Kịch bản lệnh sys-snap.shlà một tập lệnh đặc biệt được viết bởi nhóm lưu trữ để thu thập tất cả các tệp nhật ký và dữ liệu cho hệ thống, vì vậy họ sử dụng đầu ra của nó trong việc theo dõi và thu thập thông tin hệ thống.


Không, tôi không sử dụng hostgator.
dùng4951

1
@ J.Chang Kịch bản là một phần của cPanel mà Hostgator và hàng trăm máy chủ khác sử dụng.
472084

@ 472084, phiên bản cpanel nào?
Pacerier
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.