
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?
ExplicaçãoApó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?
ExplicaçãoAlguns 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?
ExplicaçãoHá 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:
o bash detecta a sequência 
1>&2 e copia o conteúdo da célula 2 para a célula 1:
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 0 | 1 | 2 | 
| stdin | stderr | / dev / null | 
O bash também exibe um fluxo de erros, para que possamos encontrar o texto do arquivo na tela.
 Tarefa 4Como enviar saída stdout para stderr e saída stderr, pelo contrário, para stdout?
ExplicaçãoO princípio é exatamente o mesmo da tarefa anterior. É por isso que precisamos de um fluxo adicional para armazenamento temporário.
 Executáveis
Tarefa 5Dado arquivo test.sh
 
Os seguintes comandos são executados:
 $ ls 1 2 3 test.sh $ ./test.sh 1 2 3 
Qual será o resultado do script?
A resposta1 2 3
1 2 3
ls: cannot access '1 2 3': No such file or directory
1 2 3
 ExplicaçãoSem 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 6No diretório atual, crie um arquivo 
-c com permissões de 755 e o seguinte conteúdo:
 
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 respostaA primeira vez será exibida SURPRISE , a segunda vez echo SURPRISE
 ExplicaçãoSe 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 respostaO primeiro exibirá o conteúdo do arquivo, o segundo - o nome do arquivo.
 ExplicaçãoNo 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?
ExplicaçãoCom 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 respostaSe a variável de amizade for definida, o conteúdo da variável. Caso contrário, mágica.
 ExplicaçãoNa 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?
ExplicaçãoAs 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?
ExplicaçãoAdicione 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.