Quando alguém recebe a mensagem de erro "jobs: not found"?

3

Quando o comando jobs emite a mensagem jobs : not found ?
Além disso, por que o comando man jobs se recusa a mostrar qualquer entrada para o comando jobs ?
P.S. : Eu sou capaz de executar com sucesso o comando jobs no terminal

    
por crisron 28.01.2014 / 18:41

3 respostas

7

jobs não é um comando real, mas um comando embutido no shell que você está usando:

martin@dogmeat:~$ type jobs
jobs is a shell builtin

Quando você tentar executá-lo sem um shell, receberá uma mensagem de erro, porque não há um executável binário chamado jobs .

Ele também não tem uma página de manual, porque é apenas um builtin. Procure em man builtins como Marco disse, em man bash ou na manpage do respectivo shell que você está usando se não estiver usando bash .

EDIT: para explicar o que rodar um programa sem shell significa: quando um processo no Linux quer iniciar outro processo ( fork e exec ), ele pode envolver esse processo em um shell ou iniciá-lo diretamente sem um shell. Por exemplo, em perl , você pode usar a função system para iniciar um novo processo. Isso funciona bem com arquivos de programa reais como echo (carreguei o módulo warnings aqui também para que possamos ver mensagens de erro):

martin@martin ~ % ll /bin/echo 
-rwxr-xr-x 1 root root 31K Jan 17  2013 /bin/echo*
martin@martin ~ % perl -Mwarnings -e 'system "echo", "test"'
test

Mas isso não funciona com um shell embutido como jobs , porque não há arquivo binário jobs :

martin@martin ~ % perl -Mwarnings -e 'system "jobs"'
Can't exec "jobs": No such file or directory at -e line 1.

É claro que quando você já está trabalhando em um shell interativo, você provavelmente não tropeçará nesse problema. Mas isso é relevante em algumas outras situações, por exemplo, quando você está usando o diálogo de execução do Gnome Alt + F2 . Ele não envolve seu comando em um shell e, portanto, binários reais, funcionam bem, enquanto que tentar executar jobs mostrará apenas uma mensagem de erro.

Da sua mensagem de erro original, jobs : not found , eu supus que você não está em um shell, porque dentro de um shell jobs deve, é claro, funcionar bem.

    
por 28.01.2014 / 18:45
3

Eu posso receber essa mensagem de erro com:

$ ash -c $'Steve\rjobs\ '
jobs : not found

ash realmente produz:

ash: 1: Steve\rjobs : not found

Mas em um terminal, esse \r move o cursor para o início da linha e o jobs: not found sobrescreve o ash: 1: Steve .

Além disso, sua mensagem de erro pode sugerir que qualquer tentativa de executar o comando jobs não conseguiu encontrá-lo.

Há um comando jobs builtin em todos os shells das famílias csh (onde se originou), POSIX e fish . Ele lista os jobs atualmente mantidos por um shell interativo, por isso não tem significado fora de um shell e é implementado como um comando interno do shell (veja uma documentação do shell para a documentação jobs correspondente, ou a especificação POSIX ).

Geralmente não há o comando jobs como um arquivo executável (embora o POSIX exija que exista), e onde há como no Solaris, ele não faz nada (como jobs é um script ksh que chama o ksh jobs builtin, ele apenas relata os jobs (então nenhum) desse novo shell ksh que interpreta o script).

Nos sistemas que não têm o comando jobs no sistema de arquivos, os comandos que tentam executar jobs sem invocar um shell para analisar uma linha de comando relatariam um erro:

$ perl -le 'exec "jobs" or die "jobs: $!"'
jobs: No such file or directory at -e line 1.
$ env jobs
env: jobs: No such file or directory
$ find . -prune -exec jobs \;
find: 'jobs': No such file or directory
$ rc -c jobs
jobs not found

Aqueles que chamam um shell seriam bem-sucedidos, mas como iniciariam um novo shell, esse shell não teria nenhum trabalho para relatar:

$ awk 'BEGIN {system("jobs")}'
$ expect -c 'system jobs'
$ perl -le 'exec "jobs || :" or die "jobs: $!"'
$ python -c 'import os; os.system("jobs")'
$ 
    
por 28.01.2014 / 20:59
1

Que idade tem esse livro? Unix shells nem sempre tiveram controle de trabalho. O shell Bourne original não funcionou e, por um tempo, era comum as duas opções serem sh (Bourne, sem controle de tarefa) e csh (controle de tarefa). A resposta do livro pode ser que jobs será not found quando você estiver usando o shell Bourne.

O único shell que posso encontrar facilmente sem um comando jobs é posh .

Em zsh , você pode executar disable jobs primeiro e, em seguida, jobs será not found .

    
por 29.01.2014 / 04:24

Tags