Aqui está a linha.
variable=`ls -A $1 | grep '[abc]'; ls -1 $1`
Entendo a linha antes do ponto e vírgula, mas não entendo como essa linha funciona depois do ponto e vírgula. Será que isso
after the command(variable assignment)
and then run the command after semi-colon?
Então a seguinte linha seria a mesma?
variable=`ls -A $1 | grep '[abc]' | ls -1 $1`
Obrigado,
Responder1
o ponto e vírgula simplesmente separa dois comandos consecutivos. a página de manual ( man bash
) diz (no capítuloListas):
Comandos separados por um ; são executados sequencialmente
por exemplo, o seguinte preenchimento, primeiro execute o comando foo
e depois o comando bar
.
foo; bar
para analisar seu exemplo corretamente, primeiro você precisa construir um modelo hierárquico dele:
variable=`ls -A $1 | grep '[abc]'; ls -1 $1`
pode ser dividido em (algo dentro de crases) e (a coisa dentro de crases).variable=
...
ls -A $1 | grep '[abc]'; ls -1 $1
backticks são usados para obter a saída de um comando (veja oSubstituição de comandoem man bash
); então você está atribuindo a saída inteira ls -A $1 | grep '[abc]'; ls -1 $1
à variável.
a saída do comando substituído é a lista de arquivos que correspondem a um determinado padrão (incluindo hildes ocultos) anexada à lista completa de arquivos (para qualquer coisa que possa ser usada ...)
Responder2
Não, eles não são iguais, o último entraria grep
( ls
o que quase certamente não é o que você deseja). O ponto e vírgula simplesmente separa dois comandos diferentes.
Em primeiro lugar, você provavelmente deseja começar a usar omais novo e mais flexível $( ... )
em vez do backtick.
Tome isto como exemplo:
$ var=`echo foo; echo bar`
$ echo "$var"
foo
bar
Você pode pensar nos backticks (ou $( ... )
) como retornando tudo o que foi impresso na saída padrão durante a execução do código contido entre eles.
No seu caso, ele analisa a saída de ls -A $1
uma vez e procura uma linha em sua saída contendo a
, b
, ou e c
, em seguida, imprime uma saída de coluna única de ls -1 $1
. Em geral, isso é uma má ideia,você não deve analisar ls.