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$