Como o Bash processa uma linha de comando?

1

De Aprendendo a concha de basquete de Newham :

Each line that the shell reads from the standard input or a script is called a pipeline; it contains one or more commands separated by zero or more pipe characters (|). For each pipeline it reads, the shell breaks it up into commands, sets up the I/O for the pipeline, then does the following for each command (Figure 7-1):

  1. Splits the command into tokens that are separated by the fixed set of metacharacters: SPACE, TAB, NEWLINE, ;, (, ), <, >, |, and &. Types of tokens include words, keywords, I/O redirectors, and semicolons.
  1. Depois que o shell divide um pipeline em comandos separados por | , por que | está listado como um metacaractere que separa os tokens em cada comando? Pode | aparecer em cada comando?

  2. O Manual do Bash diz que quando um shell bash executa um pipeline, ele bifurca um subshell para executar cada comando em um pipeline.

    Para cada comando em um pipeline, qual shell "faz o seguinte para cada comando": o subshell bifurcado pelo comando ou pelo shell original?

por Tim 28.04.2016 / 05:24

1 resposta

1

  • O caractere de canal | é um caractere meta porque termina uma palavra que não é citada. Isso é necessário para tornar a linguagem shell fácil de entender.

  • O modo como os shells criam os vários processos para um pipeline não é padronizado e difere entre as implementações.

O Bourne Shell originalmente criou um sub-shell que então se torna o pai de todos os processos de um pipeline e finalmente inicia o programa mais à direita no pipeline. Esse é o método que precisa de menos código que outros métodos e que permite implementar o controle de tarefas simples.

Bash funciona de maneira semelhante.

O Ksh93 faz com que todo processo de um pipeline seja um filho direto do shell original.

    
por 28.04.2016 / 12:18

Tags