são & e; operadores unários ou binários?

2

Sobre os operadores de controle & e ; , do POSIX 2013:

Para listas assíncronas,

the format for running a command in the background is:

command1 & [command2 & ... ]

Para listas sequenciais,

the format for executing commands sequentially shall be:

command1 [; command2] ...
  1. & é unário ou binário? É ; unário ou binário?

    & e ; parecem com binários, que operam os comandos antes e depois deles, e indicar que a ordem de execução entre os dois comandos é concorrente ou sequencial.

    & parece unário, porque cada comando em uma lista assíncrona é seguido por um & .

    ; não parece unário, porque o último comando em um lista sequencial não precisa dos seguintes ; .

    Nota: operadores operam em operandos. Dependendo do número de operandos, podemos dizer que um operador é unário, binário, .... operadores, se bem entendi, são operadores em comandos.

  2. Em uma lista mista de & e ; , qual é a ordem de execução entre os comandos do componente? O que cada um dos & e ; significa para o comandos de componentes?

    Por exemplo, no Bash

    $ echo 1 ; echo 2 & echo 3; echo 4 & echo 5
    1
    [1] 11089
    3
    2
    [2] 11090
    5
    4
    [1]-  Done                    echo 2
    [2]+  Done                    echo 4
    
    $ echo 1 ; echo 2 & echo 3; echo 4 & echo 5 ; echo 6 &
    1
    [1] 11100
    3
    [2] 11101
    5
    [3] 11102
    6
    4
    2
    [1]   Done                    echo 2
    [2]-  Done                    echo 4
    [3]+  Done                    echo 6
    
por Tim 22.03.2016 / 21:00

3 respostas

4

  1. Eu normalmente não pensaria neles como "operadores". Quer dizer, tipicamente os operadores retornam valores. & e ; não. Em vez disso, terminam as declarações. Mas se você os considerar como operadores, eles operam em uma única instrução - então eles seriam operadores unários postfix, suponho.

  2. Eles são iniciados da esquerda para a direita. Observe que, no caso de & , ele é executado em segundo plano de forma assíncrona: echo 1 & echo 2 & echo 3 pode imprimir 1, 2 e 3 em qualquer ordem (porque, mesmo que tenham sido iniciados em ordem, o kernel pode não agendá-los de forma que imprimam em ordem). Mas echo 1; echo 2; echo 3 sempre os imprimirá em ordem numérica. echo 1; echo 2 & echo 3 sempre imprime 1 primeiro, mas 2 e 3 podem estar em qualquer ordem.

por 22.03.2016 / 21:26
2

Para adicionar a resposta do derobert e dissecar o comando que você incluiu na sua pergunta:

echo 1 ; echo 2 & echo 3; echo 4 & echo 5 ; echo 6 &

Isso significa no pseudocódigo:

print 1 (and complete this step before continuing)

start a process in the background that will eventually print 2,
  and keep going as soon as the process has been *started*

print 3 (and complete this before continuing)

start a background process that will eventually print 4,
  and keep going as soon as it has started

print 5 (complete this before continuing)

start a background process that will print 6.

Observe também que qualquer comando para o shell deve ser finalizado (seja com & ou ; ou uma nova linha ou fim de arquivo ou algo que eu não esteja pensando agora), caso contrário o shell não saberá quando parar de ler em mais caracteres como parte desse comando e realmente executar o comando.

    
por 22.03.2016 / 21:31
0

Observe que o bash possui comandos internos que são muito semelhantes ao caso geral de uma linha de comando. Eu vou pular esse aspecto.

Mas, em geral, uma linha de comando é uma série de comandos separados por pontuação especial, não por operadores.

Um comando é o nome do executável (que pode ser pesquisado através da variável de ambiente PATH). Esse é o programa que será executado para executar o comando.

Após o comando, as strings separadas por espaços em branco são transmitidas ao comando como strings. Mas há caracteres de pontuação especiais que devem ser escapados (usando \ 'ou usando aspas) se você pretende que eles façam parte de um argumento.

Os caracteres de pontuação têm efeitos.

Os caracteres de pontuação especiais como '<', '>' e seus parentes definem a saída de entrada padrão e o erro para o comando

'|' para terminar um comando e canalizar sua saída padrão para a próxima entrada padrão de comandos

';' para executar o comando anterior e aguardar sua conclusão. ou seja, corra em primeiro plano.

'&' para executar o comando anterior, mas continue com o processo da linha de comandos sem aguardar a conclusão. ou seja, executar em segundo plano.

Portanto, esteja ciente de que a intenção dessas marcas sintáticas é permitir que você junte essas coisas para fazer coisas como

echo perl myperlprogram.pl \< mydata.txt | at 12:35

O que faz uma string usar echo , que é outro comando shell, para executar um programa perl, e enviar essa string para o comando at para executá-lo como um trabalho em lote posteriormente. Mas observe que o < é escapado, então é passado como um argumento para echo (que o enviará para at como entrada), em vez de definir a entrada padrão imediatamente. Quando o sistema em lote e executa a seqüência de comando, então ele irá definir a entrada padrão do programa perl.

Existem elaborações lidando com comandos embutidos e coisas como parênteses que podem ser aprendidas assim que o básico é entendido

    
por 22.03.2016 / 22:22