Apa arti ampersand di akhir baris skrip shell?

118
sh sys-snap.sh &

Apa sh? Apa sys-snap.sh? Mengapa saya harus meletakkannya &di akhir baris? Adakah yang bisa menjelaskan sintaks?

Tanpa &skrip tidak akan kembali ke prompt sampai saya tekan Ctrl+ C. Dengan &saya dapat menekan enter dan berfungsi.

pengguna4951
sumber
2
Apakah ampersand ganda &&berbeda dari ampersand tunggal &?
Charlie Parker
1
@CharlieParker Apakah Anda pernah menemukan jawaban untuk itu? Saya mencoba mencari tahu perbedaannya sendiri. (Sunting: Nevermind, temukan lebih jauh ke bawah)
Drazen Bjelovuk

Jawaban:

94

shadalah shell yang kompatibel dengan Bourne default (biasanya bash atau dash)

sys-snap.shadalah skrip shell, yang berisi perintah yang shdijalankan. Karena Anda tidak memposting kontennya, saya hanya bisa menebak dari namanya, apa fungsinya. Saya dapat menemukan skrip yang terkait dengan CPanel dengan nama file yang sama, yang membuat file log dengan semua proses saat ini, penggunaan memori saat ini, status database dll. Jika skrip dimulai dengan garis shebang ( #!/bin/shatau serupa), Anda dapat membuatnya dapat dieksekusi dengan chmod +x sys-snap.shdan mulai secara langsung dengan menggunakan ./sys-snap.shjika ada di direktori saat ini.

Dengan &proses dimulai di latar belakang, sehingga Anda dapat terus menggunakan shell dan tidak harus menunggu sampai skrip selesai. Jika Anda lupa, Anda bisa menghentikan proses yang sedang berjalan dengan Ctrl-Zdan melanjutkannya di latar belakang dengan bg(atau di latar depan dengan fg). Untuk informasi lebih lanjut, lihat kontrol pekerjaan

Jofel
sumber
4
shdi biasanya hanya bashatau dashdi sistem berbasis Linux (atau OS / X terbaru). Pada BSD, biasanya ini merupakan varian lain dari Ash (tanda hubung didasarkan pada NetBSD sh, itu sendiri berdasarkan pada Almquist Shell) atau turunan pdksh. Pada Unites komersial, umumnya ksh88.
Stéphane Chazelas
1
@ jofel: Bagaimana jika skrip di bawah ini berjalan dan secara keliru saya telah menjalankan Ctrl-C. Apakah skrip saya akan dieksekusi atau akan dihentikan? Contoh: sh sys-snap.sh &
Hussain7
2
@ Hussain7 Ctrl-C selalu dikirim ke proses saat ini di latar depan. Jika skrip shell dimulai dengan &dan karenanya di latar belakang, Anda hanya mendapatkan prompt shell baru.
jofel
2
Apakah ampersand ganda &&berbeda dari ampersand tunggal &?
Charlie Parker
7
@CharlieParker Ya, "&&" adalah fungsi "dan". Perintah setelah && dipanggil hanya ketika perintah sebelumnya berhasil. Contoh "true && echo works" output "berfungsi, tetapi" false && echo no output "tidak memanggil fungsi gema.
jofel
87

Ini dikenal sebagai di job controlbawah unix. The &menginformasikan shell untuk menempatkan perintah di latar belakang. Ini berarti terus menjalankan sys-snap.shperintah tetapi mengembalikan Anda ke shell Anda untuk memungkinkan Anda terus melakukan perintah paralel.

Anda dapat melihat daftar pekerjaan yang sedang berjalan dengan jobsperintah. Anda dapat kembali ke perintah (bawa ke 'latar depan) dengan menggunakan fgperintah. Yang menarik perintah kembali ke keadaan di mana Anda tidak melihat prompt dan Anda harus mengeluarkan Ctrl- Cuntuk mematikan proses. Namun Anda dapat menangguhkan (jeda) proses itu, mengeluarkan Ctrl- Z. Ini akan menjeda sys-snap.shdan mengembalikan Anda ke prompt Anda. Anda dapat kemudian latar belakang itu (seolah-olah Anda telah mengeluarkan itu dengan yang &) dengan bgperintah, dan itu akan resume berjalan dari itu berhenti negara Ctrl- Ztelah memasukkannya ke dalam.

Perhatikan bahwa Anda dapat memiliki lebih dari satu pekerjaan sekaligus (seperti yang ditunjukkan oleh jobs):

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

Anda dapat latar belakang dan latar depan mereka menggunakan nomor pekerjaan mereka, %1akan sys-snap.shdan %2akan another-script.sh. Jika Anda menggunakan fgatau bgtanpa argumen itu akan melakukan perintah pada pekerjaan yang ditandai oleh +dalam jobsoutput di atas.

fg %1

akan dimasukkan sys-snap.shkembali ke latar depan, sementara meninggalkan another-script.shdi latar belakang.

Anda dapat mengeluarkan Ctrl- Curutan untuk menjalankan pekerjaan tanpa harus memprioritaskannya dengan killperintah, kill %1akan mengirimkan yang setara dengan Ctrl- Cke sys-snap.sh.

Jika Anda menggunakan bash shell, man bashperintah tersebut memiliki bagian terperinci di bawah bagian yang berjudul 'JOB CONTROL' yang membahas lebih detail.

Mengenai nama sys-snap.sh, di bawah nama file unix adalah arbitrer (dengan beberapa pengecualian seperti file loader dinamis). Tidak ada persyaratan bagi mereka untuk memiliki ekstensi file tertentu untuk membuat mereka berjalan sebagai skrip shell, menjalankan perintah lain seperti perlatau phpdll. Biasanya digunakan untuk memberikan kejelasan, bahwa dalam hal ini, itu adalah .shShell Script menggunakan Bourne Shell /bin/sh.

Bagian fungsional sys-snap.sh(ketika Anda melihat isinya dengan sesuatu seperti lessperintah) adalah Shebang . Pada baris pertama Anda mungkin akan menemukan salah satu dari:

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

atau serupa. Dalam istilah dasar, perintah setelah #!(seperti /bin/sh) dijalankan dan isi dari sisa file skrip diumpankan ke baris pada satu waktu. Perhatikan bahwa file tersebut juga harus diatur agar dapat dieksekusi chmodsehingga Anda dapat menjalankannya sebagai perintah. Jika izin tidak disetel, maka shebangefeknya tidak, karena Anda akan mendapatkan kesalahan:

bash: sys-snap.sh: command not found

atau jika Anda menjalankannya dengan jalur eksplisit ./sys-snap.sh( .artinya direktori kerja saat ini) Anda akan mendapatkan:

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

Alternatif lain adalah membiarkannya tanpa menjalankan izin dan secara eksplisit meminta / bin / sh untuk menjalankannya:

/bin/sh sys-snap.sh &
Drav Sloan
sumber
3
ini jawaban yang bagus satu saran yang mungkin adalah menambahkan juga apa yang nohupdilakukan, karena sering digunakan bersamaan dengan &untuk memulai suatu proses dan dapat membunuh shell yang diluncurkan tanpa mematikan proses.
Tommy
@ Drav, Apakah benar kalau begitu jobsakan selalu kembali kosong jika ini adalah perintah pertama?
Pacerier
Perhatikan bahwa menggunakan &pada akhir perintah hanya melepaskan stdin(tetapi tidak stdoutatau stderr) yang menyiratkan jika perintah / skrip Anda berjalan di latar belakang tetapi menulis stdout, Anda mungkin mengalami situasi di mana Ctrl + ctidak akan menghentikan output tetapi Anda akan dapat untuk mengetik perintah. Ini karena proses latar belakang sedang ditulis, stdouttetapi Anda tidak dapat menghentikannya karena tidak berjalan di latar depan. Info lebih lanjut di sini .
vadasambar
4

shadalah sebuah shell. Shell mana yang sebenarnya tergantung pada sistem. Contoh untuk sistem yang menggunakan bashshell standarnya:

$ 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.shakan menjadi semacam skrip shell, jadi sh sys-snap.shakan menjalankan skrip shell.

&akan menyebabkan proses shell berjalan di latar belakang. Tanpa &itu akan tetap berada di latar depan sampai script berakhir. Script akan bekerja dengan cara baik, itu hanya masalah menunggu script untuk mengakhiri atau tidak sebelum menjalankan perintah lebih lanjut.

frostschutz
sumber
1

Apakah server Anda ada di hostgator?

Skrip sys-snap.shadalah skrip khusus yang ditulis oleh tim hostgator untuk mengumpulkan semua file log dan data untuk sistem, sehingga mereka menggunakan hasilnya untuk memantau dan mengumpulkan informasi sistem.

tareq.t
sumber
Tidak, saya tidak menggunakan hostgator.
user4951
1
@ J.Chang Script adalah bagian dari cPanel yang digunakan Hostgator dan ratusan host lainnya.
472084
@ 472084, Versi cpanel yang mana?
Pacerier