Apakah `kill -p` benar-benar berfungsi?

11

Di halaman manualnya killtertulis sebagai berikut

RINGKASAN

  kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
  kill -l [ signal ]

  -p     Specify  that kill should only print the process id (pid) of the
          named processes, and not send any signals.

Tetapi ketika saya mencoba berkali-kali di kedua RH dan RHEL, perintah seperti kill -s SIGHUP |-p 123tidak pernah bekerja dan kesalahan selalu dilaporkan

bash: -p: perintah tidak ditemukan

Apakah saya melakukan kesalahan?

pengguna43312
sumber
11
Perhatikan bahwa ketika Anda mengetikkan perintah, Anda menghapus [ ]tanda kurung, dan diganti signaldengan SIGHUPdan piddengan 123? Kenapa kau melakukan itu? Karena Anda tahu bahwa simbol [, signaldan pidmeta-sintaksis, daripada literal. Mereka menunjukkan apa itu sintaks. Nah, |simbol adalah hal yang sama: indikator meta-sintaksis lain sintaks. [a | b]berarti: item sintaksis opsional, yang dapat berupa salah satu aatau b(tetapi tidak keduanya karena item tersebut harus satu).
Kaz
Terima kasih atas instruksi Anda. Ngomong-ngomong, bagaimana Anda mengucapkannya [a | b]?
user43312
Hmm. "Opsional A atau B".
Kaz

Jawaban:

51
kill [ -s signal | -p ]

Sintaks ini dalam halaman manual berarti:

Anda dapat menggunakan kill -s signal atau Anda dapat menggunakan kill -p, tetapi Anda tidak dapat menggunakan keduanya -sdan -ppada saat yang sama.

Pipa ( |) adalah singkatan (eksklusif) atau dalam dokumentasi, itu bukan bagian dari perintah.

Saat Anda mengetik

foo | bar

di shell Anda, ia akan mencoba untuk memulai foodan bar, dan menyalurkan output fooke barprogram. (Itulah shell yang melakukan itu, bukan foo(atau bar), |itu tidak diteruskan ke salah satu proses.) Dalam kasus Anda, bagian kedua adalah -p 123, jadi shell mencoba menemukan executable yang dipanggil -pdan gagal dengan pesan kesalahan itu.

Tikar
sumber
Terima kasih, @Mat. Jadi saya memberi perintah seperti kill -p 123. Dikatakan bash: kill: p: invalid signal specification. Dan kill -p SIGINT 123mengatakan hal yang sama. Saya tidak berpikir ada tempat untuk meletakkan sinyal sesuai dengan sintaks. Apakah Anda keberatan jika Anda hanya mendemonstrasikan penggunaan -popsi tersebut?
user43312
2
@ user43312: lihat jawaban slm untuk itu
Mat
32

Saya pikir Anda tersandung pada kenyataan bahwa ada perintah builtin untuk Bash dipanggil kill, bersama dengan perintah kill.

$ type -a kill
kill is a shell builtin
kill is /usr/bin/kill
kill is /bin/kill

Halaman manual yang Anda baca mengacu pada killperintah yang berada di bawah /bin. Gunakan jalur lengkap untuk memanggilnya:

$ /bin/kill -p sleep
16486

Kebetulan /usr/bin/killitu hanya tautan ke /bin/kill.

$ ls -l /usr/bin/kill
lrwxrwxrwx 1 root root 14 Feb  9  2011 /usr/bin/kill -> ../../bin/kill

$ readlink -m /usr/bin/kill
/bin/kill
slm
sumber
Ini benar-benar berfungsi. Dan saya menghargai semua demo.
user43312
@ user43312 - NP. Contoh selalu lebih mudah diikuti daripada halaman manual 8-).
slm