Czy `kill -p` naprawdę działa?

11

Na stronie podręcznika killjest napisane następująco

STRESZCZENIE

  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.

Ale jak wiele razy próbowałem zarówno w RH, jak i RHEL, polecenie jak kill -s SIGHUP |-p 123nigdy nie działało, a błąd jest zawsze zgłaszany

bash: -p: nie znaleziono polecenia

Czy popełniłem jakieś błędy?

użytkownik43312
źródło
11
Zauważ, że gdy wpiszesz w poleceniu, to usunięte [ ]wsporniki i zastąpione signalz SIGHUPi pidze 123? Dlaczego to zrobiłeś? Bo wiesz, że symbole [, signali pidsą meta-syntaktyczna, raczej niż dosłowna. Wskazują, jaka jest składnia. Cóż, |symbol jest taki sam: inny meta-syntaktyczny wskaźnik składni. [a | b]oznacza: element opcjonalny składniowym, które mogą być aalbo b(ale nie oba, ponieważ musi to być jeden element).
Kaz
Dziękuję za twoją instrukcję. A propos, jak wymawiasz [a | b]?
user43312,
Hmm „Opcjonalnie A lub B”.
Kaz.

Odpowiedzi:

51
kill [ -s signal | -p ]

Ta składnia na stronie podręcznika oznacza:

Można użyć kill -s signal albo można użyć kill -p, ale nie można używać zarówno -si -pw tym samym czasie.

Potok ( |) oznacza (wyłączny) lub w dokumentacji, nie jest częścią polecenia.

Kiedy piszesz

foo | bar

w skorupkach, będzie próbować uruchomić fooi bar, a rura wyjście fooz barprogramu. (Jest to powłoka, która to robi, a nie foo(lub bar), |nie jest przekazywana do żadnego z procesów.) W twoim przypadku druga część jest -p 123, więc powłoka próbuje znaleźć plik wykonywalny o nazwie -pi nie powiedzie się z tym komunikatem o błędzie.

Mata
źródło
Dzięki, @Mat. Więc wydaje polecenie kill -p 123. To mówi bash: kill: p: invalid signal specification. I kill -p SIGINT 123mówi to samo. Nie sądzę, aby było miejsce na umieszczenie sygnału zgodnie ze składnią. Czy masz coś przeciwko, jeśli po prostu zademonstrujesz użycie tej -popcji?
user43312,
2
@ user43312: zobacz odpowiedź SLM na ten temat
Mat
32

Myślę, że denerwujesz się faktem, że Bash ma wbudowane polecenie kill, a także polecenie kill.

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

Strona podręcznika, którą czytasz, odnosi się do killpolecenia znajdującego się pod /bin. Przywołaj pełną ścieżkę:

$ /bin/kill -p sleep
16486

Nawiasem mówiąc, /usr/bin/killjest to tylko link do /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
źródło
To naprawdę działa. Doceniam wszystkie dema.
user43312,
@ user43312 - NP. Przykłady są zawsze łatwiejsze do naśladowania niż strony podręcznika 8-).
slm