Usando tanto “source” quanto “&” no bash

3

Eu estava lendo sobre como os shells do Unix funcionam ( bash em particular), e eu tentei algo que não fazia sentido para mim.

Pelo que entendi, o comando source executa o programa que você fornece no processo shell atual em vez de bifurcar um processo filho.

Por outro lado, a execução de um comando seguido por & retorna o controle para o usuário antes que o processo executado termine. Se você executar um comando sem source , mas com & , o shell atual retornará o controle para o usuário antes da saída do processo filho.

Mas quando criei um arquivo chamado test.txt contendo hello world e executei:

source /bin/cat test.txt

… eu tenho -bash: ????: command not found .

Da mesma forma, quando tentei carregar meu virtualenv usando

source ./venv/bin/activate &

Acabei de receber o status de saída e o ID do processo [1] 26489

O que está acontecendo? Particularmente para o segundo comando. Estou confuso.

Como o source funciona e o que acontece quando você o usa com & ?

    
por karansag 13.08.2012 / 09:00

1 resposta

5

source carrega o arquivo de script bash e o interpreta no ambiente atual do shell. cat não é um script bash, mas um arquivo de programa binário e bash não conseguem interpretar com êxito seu conteúdo como código de script. Além disso, os scripts bash não projetados para uso com source possivelmente se comportarão mal.

source filename [arguments]

Read and execute commands from filename in the current shell environment and return the exit status of the last command executed from filename. [...] If any arguments are supplied, they become the positional parameters when filename is executed. Otherwise the positional parameters are unchanged. The return status is the status of the last command exited within the script (0 if no commands are executed), and false if filename is not found or cannot be read.

Quando você executar com & , será executado em segundo plano. Qualquer alteração no status será exibida apenas quando o prompt for impresso na próxima vez e se parecer com isso:

[1]+  Done                    source .bashrc

Se você realmente quer lançar um programa que substitui o shell, dê uma olhada em exec .

   exec [-cl] [-a name] [command [arguments]]
          If command is specified, it replaces the shell.  No new  process
          is  created.  The arguments become the arguments to command.  [...]
    
por 13.08.2012 / 09:11

Tags