O que significa “cd &”?

7

Eu sei como alterar o diretório do terminal digitando

cd <directory>

mas aqui está o cenário. Eu estava usando terminal para ir na pasta do meu repositório git.

  • glennRepositories
    • glenn-remdroid-repository

Dada a estrutura de pastas acima, eu quero mudar em glenn-remdroid-repository porque é meu repositório fazendo.

cd glennRepositories

Antes de mudar para o repositório glenn-remdroid, eu digitei erroneamente o comando

cd & 

em vez de cd * . Eu usei cd * porque o nome da pasta é longo para mim, desculpe por ser preguiçoso.

Quando executo o cd & , o terminal responde

[1] 7519

Quando executo cd * , isso acontece agora

[1]+  Done                    cd  (wd: ~/glennRepositories)
(wd now: ~/glennRepositories/glenn-remdroid-repository)

Alguém que cd & significa e sua saída? O Google não sabe a minha pergunta:)

    
por GLenn 23.08.2013 / 02:33

2 respostas

18

Ao escrever o & no final da linha de comando, você está instruindo seu shell a usar o pipeline de comando (neste caso, um único comando) e executá-lo em um sub-shell em segundo plano (não esperando por um resultado). cd é um bash embutido, mas isso não é importante aqui. Ele não afetará seu shell "pai" de qualquer forma, portanto, seu diretório de trabalho não será alterado.

[1] 7519

Esta linha está relatando que há um trabalho em segundo plano identificado pelo número 1 e o ID do processo é 7519. Uma coisa semelhante será impressa se você executar, e. vim e, em seguida, pressione Ctrl + Z para suspendê-lo. Quando o processo terminar, o shell não reportará isso até o próximo ciclo de processamento (por exemplo, apenas pressione Retornar novamente) e, em seguida, ele imprimirá os trabalhos de listagem de atualização concluídos.

Para mais detalhes, leia man bash e a seção JOB CONTROL .

Para referência, a pergunta Por que exit & não funciona? tem alguma semelhança.

    
por 23.08.2013 / 02:50
1

O operador & envia um processo para o segundo plano; como cd pode ser executado sem argumentos você está executando e enviando para o plano de fundo. Se você pegar a página man:

NAME

cd - Change the shell working directory.

SYNOPSIS

cd [-L|-P] [dir]

DESCRIPTION

Change the shell working directory.

Change the current directory to DIR. The default DIR is the value of the HOME shell variable.

The variable CDPATH defines the search path for the directory containing DIR. Alternative directory names in CDPATH are separated by a colon (:).
A null directory name is the same as the current directory. If DIR begins with a slash (/), then CDPATH is not used.

If the directory is not found, and the shell option cdable_vars is set, the word is assumed to be a variable name. If that variable has a value, its value is used for DIR.

Options:

-L force symbolic links to be followed
-P use the physical directory structure without following symbolic links

The default is to follow symbolic links, as if -L were specified.

Exit Status:

Returns 0 if the directory is changed; non-zero otherwise.

SEE ALSO

bash(1)

IMPLEMENTATION

GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later

Você pode ver que os argumentos são opcionais. Então

cd & é processado como cd e depois enviar para o fundo. Quando cd é chamado sem argumento, nenhum processamento é necessário. Então, ele vai para o segundo plano como "concluído" (processado).

Algumas informações sobre & O Bash & (E comercial) é um operador de controle interno usado para separar processos. Na página man do Bash, "Se um comando for terminado pelo operador de controle & , o shell executará o comando em segundo plano em um subshell".

Se conectado a um shell interativo, o processo recebe um número de trabalho e o PID filho é exibido. O número do trabalho abaixo é um.

bash$ sleep 30 &
[1] 3586

Observe que quando um processo é bifurcado, o PID filho é armazenado na variável especial $!

bash$ echo $!
3586

Você pode encerrar o trabalho pelo número do trabalho da seguinte forma:

bash$ jobs
[1]+ Running sleep 30 &
bash$ kill %1
[1]+ Terminated sleep 30
bash$
    
por 23.08.2013 / 02:48