Piping para um comando com sinalizadores

1

Eu sei que isso deve ter sido perguntado antes, eu não tinha certeza do que pesquisar exatamente, então, por favor, desculpe a pergunta duplicada.

Como é que uma pessoa "puxa" uma variável para o ponto certo quando é canalizada de um comando anterior? Eu estou tentando encontrar um PID, em seguida, encontrar arquivos abertos relacionados a esse PID, em seguida, reduzi-lo para um arquivo e execute um comando nesse arquivo. Aqui está o comando:

ps x | grep IINA | grep -v grep | awk '{print $1}'

Ok, isso me dá um PID, ótimo. Agora quero lsof -p desse PID, mas não posso simplesmente fazer ps x | grep IINA | grep -v grep | awk '{print $1}' | lsof -p .

Sem fazer ps x | grep IINA | grep -v grep | lsof -p 'awk '{print $1}'' (novamente, desculpem os backticks incorretos), como posso fazer o que estou tentando fazer?

    
por Harv 14.04.2018 / 11:40

1 resposta

6

A utilidade lsof espera o PID na linha de comando, não na entrada padrão.

Você pode usar

lsof -p "$( pgrep IINA )"

Isso executará pgrep com IINA como argumento, e a saída disso será entregue ao lsof como um argumento de opção para a opção -p usando uma substituição de comando.

Se IINA não for o nome do comando, mas uma parte da linha de comando usada para iniciar o processo, adicione o -f flag a pgrep .

Se você obtiver vários hits com pgrep , convém usar -n (obtém o processo de correspondência iniciado mais recentemente) ou -o (obtém o processo de correspondência mais antigo), se sua implementação pgrep oferecer suporte a isso ou você pode usar

lsof -p "$( pgrep IINA | tr '\n' ',' )"

para criar uma lista delimitada por vírgulas de PIDs para lsof -p .

    
por 14.04.2018 / 11:48