
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.