Você conhece bem o bash?


Você usa a concha todos os dias? Pronto para resolver alguns problemas lógicos e aprender algo novo? Bem-vindo ao gato.

Algumas das tarefas apresentadas aqui não trarão benefícios reais, pois afetam alguns casos de fronteira complexos. A outra parte será útil para quem usa constantemente o shell e lê os scripts de outras pessoas.

Nota: no momento da redação deste artigo, o autor usava o lançamento do bash 4.4.12 (1) no subsistema Linux no Windows 10. A complexidade das tarefas é diferente.

Fluxos de entrada / saída


Tarefa 1

$ cat 1 The cake is a lie! Wanted! Cake or alive $ cat 1 | head | tail | sed -e 's/alive/dead/g' | tee | wc -l > 1 

Quantas linhas estarão no arquivo 1 após o comando?

A resposta
1

Explicação
Após interpretar o comando, mas antes de executar todos os programas, o bash funciona com os fluxos de entrada / saída especificados. Assim, o arquivo 1 é limpo antes de iniciar o primeiro programa e o cat abre o arquivo já limpo.

Tarefa 2

 $ cat file1 I love UNIX! $ cat file2 I don't like UNIX $ cat file1 <file2 

O que será exibido na tela?

A resposta
I love UNIX!

Explicação
Alguns programas usam stdin quando os arquivos são especificados.

Tarefa 3

 $ cat file Just for fun $ cat file 1>&2 2>/dev/null 

O que será exibido na tela?

A resposta
Just for fun

Explicação
Há um equívoco de que a sequência 1>&2 redireciona o primeiro thread para o segundo; no entanto, isso não é verdade. Considere a equipe da tarefa. No início da interpretação do comando digitado, a tabela de fluxo fica assim:
0 012
stdinstdoutstderr

o bash detecta a sequência 1>&2 e copia o conteúdo da célula 2 para a célula 1:
0 012
stdinstderrstderr

Após detectar a sequência 2>/dev/null intérprete grava o valor na célula 2, deixando as outras células intactas:
0 012
stdinstderr/ dev / null

O bash também exibe um fluxo de erros, para que possamos encontrar o texto do arquivo na tela.

Tarefa 4
Como enviar saída stdout para stderr e saída stderr, pelo contrário, para stdout?

A resposta
4>&1 1>&2 2>&4

Explicação
O princípio é exatamente o mesmo da tarefa anterior. É por isso que precisamos de um fluxo adicional para armazenamento temporário.

Executáveis


Tarefa 5

Dado arquivo test.sh

 #!/bin/bash ls $* ls $@ ls "$*" ls "$@" 

Os seguintes comandos são executados:

 $ ls 1 2 3 test.sh $ ./test.sh 1 2 3 

Qual será o resultado do script?

A resposta
1 2 3
1 2 3
ls: cannot access '1 2 3': No such file or directory
1 2 3


Explicação
Sem aspas, as variáveis ​​$ * e $ @ não são diferentes e são expandidas em todos os argumentos posicionais do script, separados por um espaço. Entre aspas, o método de divulgação muda: $ * se transforma em "$ 1 $ 2 $ 3" ​​e $ @ por sua vez em "$ 1" "$ 2" "$ 3". Como o arquivo “1 2 3” não está no diretório, ls exibe um erro

Tarefa 6

No diretório atual, crie um arquivo -c com permissões de 755 e o seguinte conteúdo:

 #!/bin/bash echo $1 

Zere a variável $ PATH e tente executar:

 $ PATH= $ -c "echo SURPRISE" 

O que será exibido na tela? O que acontece se você digitar novamente o último comando?

A resposta
A primeira vez será exibida SURPRISE , a segunda vez echo SURPRISE

Explicação
Se PATH estiver vazio, o shell começará a procurar arquivos no diretório atual. -c está localizado. Como o arquivo executável é um arquivo de texto, a primeira linha é lida sobre o assunto shebang. A equipe é montada de acordo com o modelo:

 <shebang> <filename> <args> 

Assim, antes da execução, nosso comando se parece com o seguinte:

 /bin/bash -c "echo SURPRISE" 

E, como resultado, não é exatamente o que queríamos fazer.

Se você executá-lo uma segunda vez, o shell coletará informações sobre -c no cache e as executará corretamente. A única maneira de se proteger de um efeito tão inesperado é adicionar dois menos ao shebang.

Variáveis


Tarefa 7

 $ ls file $ cat <$(ls) $ cat <(ls) 

O que será exibido no primeiro e no segundo caso?

A resposta
O primeiro exibirá o conteúdo do arquivo, o segundo - o nome do arquivo.

Explicação
No primeiro caso, a substituição é realizada

 cat <file 

No segundo caso, <(ls) será substituído por um pipe nomeado conectado pela entrada ao stdout ls e à saída do stdin cat.

Após a substituição, o comando assumirá o formato:

 cat /dev/fd/xx 


Tarefa 8

 $ TEST=123456 $ echo ${TEST%56} 

O que será exibido na tela?

A resposta
1234

Explicação
Com esse registro, o padrão corresponde (# - do início da variável; ## - avidamente do início da variável;% - do final da variável; %% - avidamente do final da variável) e é excluído ao substituir. O conteúdo da variável permanece intacto. Assim, por exemplo, é conveniente obter o nome do arquivo sem a extensão.

 $ TEST=file.ext $ echo ${TEST%.ext} file 


Tarefa 9

 $ echo ${friendship:-magic} 

O que será exibido na tela?

A resposta
Se a variável de amizade for definida, o conteúdo da variável. Caso contrário, mágica.

Explicação
Na documentação, essa mágica é chamada "não definida ou nula" e permite que você use o valor padrão especificado de uma variável em uma linha.

Ordem de execução


Tarefa 10

 while true; false; do echo Success done 

O que será exibido na tela?

A resposta
Nada

Explicação
As instruções while e if permitem incluir uma sequência inteira de ações na condição, mas o resultado (código de retorno) será levado em consideração apenas no último comando. Como é falso, o loop nem começará.

Tarefa 11

 $ false && true || true && false && echo 1 || echo 2 

O que será exibido na tela?

A resposta
2

Explicação
Adicione parênteses por ordem explícita e simplifique o comando, levando em consideração que apenas o código de retorno do último comando é levado em consideração:

 ((((false && true) || true) && false) && echo 1) || echo 2 (((false || true) && false) && echo 1) || echo 2 ((true && false) && echo 1) || echo 2 (false && echo 1) || echo 2 false || echo 2 echo 2 


Comentários, sugestões e tarefas adicionais são bem-vindas nos comentários ou no PM.

Source: https://habr.com/ru/post/pt413935/


All Articles