`Kill -p` realmente funciona?

11

Na página do manual killestá escrito da seguinte maneira

SINOPSE

  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.

Mas, como tentei várias vezes no RH e no RHEL, comandos como kill -s SIGHUP |-p 123nunca funcionaram e um erro é sempre relatado

bash: -p: comando não encontrado

Eu cometi algum erro?

user43312
fonte
11
Observe que, quando você digitou o comando, removeu os [ ]colchetes e substituiu signalpor SIGHUPe pidcom 123? Porque você fez isso? Porque você sabe que os símbolos [, signale pidsão meta-sintática, e não literal. Eles indicam qual é a sintaxe. Bem, o |símbolo é a mesma coisa: outro indicador meta-sintático da sintaxe. [a | b]significa: item sintático opcional, que pode ser um aou b(mas não ambos, pois deve ser um item).
Kaz
Obrigado pela sua instrução. A propósito, como você pronuncia [a | b]?
user43312
Hmm. "Opcional A ou B".
Kaz

Respostas:

51
kill [ -s signal | -p ]

Essa sintaxe em uma página de manual significa:

Você pode usar kill -s signal ou pode usar kill -p, mas não pode usar os dois -se -pao mesmo tempo.

O pipe ( |) significa (exclusivo) ou na documentação, não faz parte do comando.

Quando você digita

foo | bar

na sua concha, ele tentará iniciar fooe bar, e canalizar a saída de fooao barprograma. (É o shell que faz isso, não é foo(ou bar), |não é passado para nenhum dos processos.) No seu caso, a segunda parte é -p 123, portanto, o shell tenta encontrar um executável chamado -pe falha com essa mensagem de erro.

Esteira
fonte
Obrigado, @ Mat. Então eu dou um comando como kill -p 123. Diz bash: kill: p: invalid signal specification. E kill -p SIGINT 123diz a mesma coisa. Acho que não há lugar para colocar o sinal de acordo com a sintaxe. Você se importa se você apenas der uma demonstração do uso da -popção?
user43312
2
@ user43312: veja a resposta de SLM para isso
Mat
32

Acho que você está tropeçando no fato de que existe um comando interno para o Bash chamado kill, junto com o comando kill.

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

A página de manual que você está lendo se refere ao killcomando localizado em /bin. Use o caminho completo para evocá-lo:

$ /bin/kill -p sleep
16486

Aliás, o /usr/bin/killé apenas um link para /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
fonte
Isso realmente funciona. E agradeço por todas as demos.
user43312
@ user43312 - NP. Os exemplos são sempre mais fáceis de seguir do que as páginas de manual 8-).
slm