>> [Seminário - Conchas Unix, Ambientes]
[Douglas Kline - Harvard University]
[Isto é CS50. - CS50.TV]
>> Tema de hoje é o shell do Unix.
Estou Douglas Kline, perito, ou pelo menos razoavelmente usuário competente, da shell.
A shell é a interface para o usuário do sistema operacional do computador.
O nome é enganador, como, ao contrário de shell de um animal,
que é dura e protectora, o invólucro do computador permite a comunicação.
Então membrana porosa provavelmente seria uma metáfora melhor.
>> O escudo original para Unix é o shell Bourne.
Bourne está escrito B-O-U-R-N-E.
Bourne foi um dos autores originais do Unix,
e assim que o shell é nomeado após ele.
O nome do que shell como um comando é simplesmente sh.
Esse é o comando que você pode executar.
A casca começa no início da sessão.
Quando você faz logon no computador, o shell só começa a funcionar para você,
e é isso que leva seus comandos.
Ela pode começar em outras ocasiões também.
Se você abrir uma janela com nenhuma outra indicação, ele irá iniciar um shell para você.
É assim que é que você pode ir a uma janela e começar a digitar comandos
e assim por diante lá mesmo que você não se registrar para essa janela.
Além disso, se você fizer um login remoto,
em seguida, ele irá iniciar um shell no computador remoto.
E é possível executar comandos sem um shell interativo.
Isso pode significar dentro de sua operação atual,
e também pode significar uma operação remota.
Você poderia enviar um comando para outro computador,
que inclui iniciar um shell lá.
Na verdade, ele tem de incluir o arranque de uma concha lá
mesmo que isso não é o seu propósito final.
Quando algo começa a ficar assim, isso não significa necessariamente iniciar um novo shell.
Se você abrir uma nova janela, é possível dizer que para abrir um editor
ou algum outro comando.
Nesse caso, o editor vai começar do zero.
Quando a edição termina, a janela termina.
Isto é um pouco incomum, mas isso pode ser feito.
Nesses casos, não será uma concha.
Portanto, não é necessariamente o caso que uma janela ou alguma aplicação trará uma shell.
>> Shell analisa comandos.
Análise significa identificar os vários elementos e classificá-los.
Dentro de um comando, a cadeia completa que você digita,
haverá um ou mais comandos simples a serem executados.
Outros elementos podem ser argumentos.
Também pode haver caracteres especiais que afectam a execução de um comando.
Eles podem enviar a saída em outro lugar que a tela
se o comando normalmente seria enviá-lo para a tela.
Ele pode redirecionar a entrada, que pode fazer outras coisas também.
Existem vários outros símbolos, caracteres, e assim por diante.
Análise envolve detectar e interpretar as coisas.
>> Agora, se não há mais perguntas, o que é bastante provável, já que não há mais pessoas,
vamos passar a minha próxima página aqui.
>> Eu disse anteriormente que o shell Bourne é o shell inicial.
Há outros.
Um deles é o C-shell. O comando é csh.
O nome C-shell é apenas um jogo de palavras.
Este escudo foi introduzido com Berkeley Unix, em meados da década de 1970.
Berkeley Unix foi um acontecimento decisivo no desenvolvimento de Unix.
Foi uma grande revolução e incluiu a introdução deste shell.
A razão para que o jogo de palavras, C-shell,
é que o C-shell tem algumas características nele que se assemelham a linguagem C,
qual o shell Bourne não tem -
ou ele não tinha na época.
Há também o TC-shell.
Este é um superconjunto do C-shell.
Ele tem características adicionais, muitos dos quais são úteis para o uso interativo,
tal como recordando comandos no mecanismo de histórico,
que eu vou descrever um pouco mais tarde -
de uma forma simples, modelado após um editor.
Ele também tem ligações que lhe permitem ligar uma string chave curta para um comando mais longo.
Nós não vamos estar recebendo em que hoje.
Ele tem algumas características que são úteis para a programação.
No entanto, o C-shell não é frequentemente utilizado para programação shell.
Programas Shell, se você já não soubesse,
são programas que consistem em características de fachada.
Você pode executar estes como programas.
Você escreve um monte de comandos shell em um arquivo e executar o arquivo.
Você não precisa compilá-lo. Esta é uma linguagem interpretativa.
A frase C-shell é agora ambíguo, pois pode referir-se apenas ao original C-shell, csh,
ou para todos os C-shells, incluindo tcsh. É um pouco ambígua.
>> A shell mais tarde é o shell Korn, ksh, em homenagem ao programador, Korn.
Esta concha tentou incorporar em um shell
as vantagens do C-shell para uso interativo
eo Bourne shell para a programação.
Ele tem sido usado como um escudo interactivo por algumas pessoas - uma minoria.
Mais tarde, porém, houve uma outra introdução, o shell bash, Bash,
novamente um jogo de palavras, Bourne-again shell.
É uma extensão do shell Bourne. Korn shell também é. Ambos são.
Ele tem os mesmos objetivos do shell Korn de amalgamando do C-shell
e as vantagens de Bourne shell em um shell.
Muitas das melhorias do shell Korn também estão incluídos em Bash.
Bash, no entanto, tem mais e é por isso preferível.
The Bourne-again shell eo shell Korn são chamados Bourne tipo conchas
porque incluem características do Bourne shell,
que são incompatíveis em alguns aspectos com C-conchas.
Há outras conchas, além daqueles, outros destinados ao uso restrito,
talvez limitado a alguns comandos, talvez propósitos especializados, muitas vezes não é usado.
>> Okay. Next item aqui.
O Bash shell tornou-se associada a várias formas de Linux.
Eu não tenho certeza se isso é verdade de todas as formas.
Existem muitas formas lá fora e eu não usei todos eles,
mas aqueles que eu usei, tornou-se associado a ele.
Até onde eu sei, não há nada sobre Bash
o que o torna mais compatível com Linux
do que qualquer outra combinação de concha e sistema operacional.
Eu acho que isso provavelmente reflete as inclinações dos programadores.
Isso tornou-se associado com o Linux é mais um motivo para preferir Bash para ksh
desde que as coisas tendem a ser escrito nele e é provável a se espalhar.
Vou te dar outras razões para isso mais tarde.
Scripts shell Bourne deve ser executado sob o shell Korn ou Bash.
Se você escrever algo para o shell Bourne,
provavelmente você pode executá-lo sob ksh ou bash.
Scripts shell Korn provavelmente será executado sob Bash, mas não posso garantir isso.
Mais tarde, aqui, os scripts de C-shell deve ser executado sob o TC-shell.
O C-shell foi realmente nunca usado extensivamente para scripting
desde o shell Bourne e depois as conchas Bourne tipo eram preferíveis para essa finalidade.
Então, o que realmente não é tão importante assim.
Há um monte de scripts shell Bourne que foram escritas há muito tempo,
antes do shell Korn ou o Bourne-again shell foram introduzidas.
Aqueles que ainda estão em uso, parte dos sistemas operacionais,
e assim você vai encontrá-los se você olhar para o sistema operacional
ou alguns pacotes de programação antigas.
>> Bash é de certa forma a tornar-se uma espécie de língua franca para sistemas operacionais.
É já foi estendido para o Windows e VMS.
VMS, no caso de você não sabe, é um sistema operacional proprietário
da Digital Equipment Corporation, que ainda está em uso, em grande parte, nos bastidores.
E se ele vai estar em execução em vários sistemas operacionais diferentes,
provavelmente as pessoas tendem a mudar para ele.
Mas este desenvolvimento é relativamente recente.
É apenas o começo, então eu não posso prever se isso vai passar a ser realmente esse tipo de língua franca.
Além disso, porque caminhos de arquivo e bibliotecas diferem
entre estes sistemas operacionais diferentes,
você pode não ser capaz de escrever um script Bash em um sistema operacional
e, em seguida, executá-lo em outro.
Você deve ser capaz de movê-lo entre diferentes Unix, Linux
Sistemas operacionais Mac OS, mas não necessariamente para o Windows ou VMS.
Você pode ter que alterar as descrições do arquivo pathname,
e algumas bibliotecas pode ser diferente,
o que pode afetar a maneira que alguns comandos funcionam
ou como eles processam argumentos e afins.
Além disso, outra precaução aqui é que não há qualquer garantia
que todas as diferentes conchas que eu mencionei - Bourne shell, C-shell,
TC-shell, Korn, Bourne-again shell - estarão disponíveis em qualquer Unix
ou Linux ou Mac OS.
Eles simplesmente podem não estar lá.
Essa é uma das precauções aqui.
É uma limitação infeliz aqui desde que você gostaria que as coisas funcionem em todos os lugares,
mas, infelizmente, você não pode contar com isso.
>> Okay. Next one aqui.
Vamos dizer que você quer escrever um shell script,
um programa que consiste de comandos shell.
Você escreve seus comandos, colocá-los em um arquivo e executar o arquivo.
E se você quiser incluir argumentos?
No caso de operações de fachada, os argumentos são chamados de parâmetros ou parâmetros posicionais
e eles vão ser chamados por um sinal de dólar e numeral, $ 1, $ 2.
Portanto, se o script tem esse nome, o meu primeiro argumento pode ser argumento 1
e meu segundo pode ser argumento 2,
e dentro do meu roteiro, se eu quiser se referir a essas coisas -
vamos apagar isso desde que eu realmente não estou indo para executá-lo -
dentro do meu script que eu possa ter um dólar para se referir a arg1,
$ 2, que vai sair dessa forma, arg2.
Então, esses símbolos estão disponíveis para se referir aos argumentos,
e aqueles que se aplicam a todas as conchas.
Além disso, existem outros caracteres.
$ * Refere-se a toda a lista de argumentos, todos eles.
$ # Refere-se ao número de argumentos.
Mais uma vez, isso se aplica a todas as conchas.
Esses símbolos, * e #, pode ser usado com esses significados em outros lugares também.
Nós não vai ter para isso.
>> Linha especificador Shell. O que é isso?
Digamos que você tenha escrito um roteiro e é por uma concha especial e você quer executá-lo.
Como você sabe o que desembolsar o seu sistema operacional vai usar para executar o script?
Em um ponto, você poderia supor que iria executá-lo no shell Bourne
se você não dizer o contrário,
mas as pessoas não estão a escrever scripts no Bourne Shell que muito mais
e você não pode mesmo contar com isso.
Portanto, temos aqui uma linha de especificador shell aqui.
Isso especifica Bash.
Note-se que especifica-la no caminho, / bin / bash.
Se um computador tem o shell bash, mas não no diretório bin, / bin, isso não vai funcionar.
Esse é outro qualificador, outro cuidado aqui.
O sinal de libra é o caractere de comentário de linha.
Isso se aplica a todas as conchas.
O caso particular aqui, #! no início de um script, é um caso especial.
Isso especifica o shell em que para executar o script.
Como eu estava dizendo, ele pode não ser o mesmo lugar / bin.
Além disso, há outra coisa aqui.
Se você usar apenas o sinal de libra, sem ponto de exclamação e caminho,
que deve indicar um C-shell.
No entanto, eu não recomendo fazer isso porque eu não sou capaz de garantir
que isso vai funcionar sempre.
Se você quiser um C-shell, seria melhor dizer assim.
Então, há algo um pouco confuso aqui.
Se você usar uma linha de shell especificador, como / bin / bash
e que a casca não está disponível lá,
não há tal coisa como / bin / bash nesse computador particular,
ou porque ele não tem Bash ou porque está em um local diferente,
você receberá um erro informando que o script que você correu não existe.
E, claro, existe o script, de modo que a mensagem de erro é confuso.
A razão pela qual o sistema operacional lhe dá esse erro
ou, mais precisamente, que o seu shell interativo no qual você está executando o que dá esse erro,
é que ele relata o comando utilizado, que é o nome do script.
Esse comando efetivamente chamado de shell com o nome do script.
É aí que você começa a mensagem de erro confuso.
Outra maneira de chamar script shell
é especificando o shell na linha de comando, como aqui.
Este é um comando. Isto diz Bash executar e, em seguida, executar o meu script em Bash.
Isso vai ter precedência sobre uma linha de especificador,
e este tem a característica de permitir que você fornecer para caminhos diferentes.
Se você acabou de dar um comando, o sistema operacional irá olhar para o comando
em vários lugares.
Se estiver disponível, ele deve encontrá-lo.
O computador vai encontrar Bash onde ele está localizado e executá-lo,
para que você não precisa, então, a se preocupar com onde encontra-lo.
Há potencialmente outras preocupações aqui,
como se há mais do que uma versão do Bash, que é possível, embora improvável.
Então, isso é uma outra maneira de lidar com essas coisas.
Linhas de especificador pode chamar qualquer shell.
Eles também podem chamar outros de conchas coisas.
Exemplos que tenho aqui são sed, que é o editor de fluxo;
awk, que é uma linguagem de processamento padrão;
e perl, uma linguagem de script muito altamente desenvolvida.
Se você colocar uma linha especificador indicando um desses programas, no início,
ele irá diretamente para o programa, em vez de iniciar uma shell.
Esses programas têm limites para suas habilidades.
Perl é muito capaz. Sed é um editor. Ele pode fazer coisas além de simplesmente editando.
Mas pode ser difícil de programa que.
Além disso, a passagem de argumentos e outras coisas para o script é impossível ou confuso.
Então, nesses casos, com awk ou sed, é, pelo menos na minha experiência,
preferível escrever um shell script e chamada awk ou sed do script shell
ao invés de chamar awk ou sed como a linha de especificador de script.
Perl é uma linguagem altamente diversificada, como eu disse.
Você não pode executar comandos interativos em perl,
o que significa que você não pode testar peças de scripts que você está em desenvolvimento
, executando-os de forma interativa.
No entanto, é uma linguagem extremamente capaz
e tornou-se uma ferramenta muito utilizada.
Isso é apenas um pouco mais de uma observação entre parênteses sobre as linhas de especificador.
>> Em todas ou a maioria das formas de Linux - mais uma vez, eu não posso ter certeza de que é tudo -
e no Mac OS, se você digitar csh você começa tcsh,
e se você digitar sh você começa bash.
Eles estavam tentando lá para dar-lhe as versões mais avançadas desses conchas,
mas isso pode ser confuso.
Se você escrever um script usando tcsh ou Bash apresenta ao chamar csh ou sh
e tente executá-lo em um computador que não tem tcsh ou Bash,
você pode obter alguns erros se existem comandos lá
que essas conchas não reconhece.
Além disso, você pode ter chamado a sua concha em seu computador local
chamando-o como sh ou csh e em seguida, obter as conchas mais avançados.
Você pode até não pensar no fato de que você está usando o shell mais avançado.
Portanto, esta é uma armadilha potencial.
Como é estabelecido que se você digitar sh você começa Bash,
se você digitar csh você começa tsch?
Há coisas nestes computadores chamados ligações
que pode conectar-se a nomes de arquivos para se referir à mesma coisa.
Ele quer pode ser de 2 nomes para o mesmo arquivo ou um arquivo cuja finalidade é para se referir a outro arquivo.
Eles são chamados de links físicos e simbólicos. Não vamos estar indo para mais isso hoje.
Também pode haver arquivos separados - um arquivo sh, 1 arquivo Bash -
mas ambos executar Bash.
Depois, há um outro qualificador aqui.
Se você está ligando para um destes shells por um nome,
você pode pensar que você deseja obter a mesma funcionalidade que chamá-la por outro nome.
Bem, isso realmente não é necessariamente verdade.
Estes comandos podem examinar o nome pelo qual eles foram chamados
e eles podem, com base em que o nome, se comportam de forma diferente.
Pode haver problemas de tentar obedecer a um padrão.
Alguns de vocês podem ter ouvido falar do padrão POSIX ou de outra,
talvez outros recursos.
Isto pode ser seleccionado, por vezes, através de argumentos de linha de comando
ou definindo variáveis ​​shell.
Chamando-o como sh ou bash pode realmente levar a uma execução diferente
mesmo que seja o mesmo arquivo que você está executando.
Outra coisa a considerar é que, mesmo se outro computador tem tcsh ou Bash,
se eles não estão ligados como estão em seu computador local
se você tiver um computador local Linux ou Mac OS,
em seguida, novamente você vai ter o shell que você chama sh ou csh, não aquele que você pode preferir.
A corrente de Bourne shell tem melhorias menor do que aqueles em Bash
mas passado os do shell Bourne originais.
Como resultado disso, até mesmo o shell atual Bourne, sh,
mesmo quando não é Bash, assemelha-se à linguagem C mais do que o C-shell faz.
Isso não era verdade quando o C-shell foi criada pela primeira vez, mas desenvolveu-se dessa forma.
Você pode notar aqui que todos esses nomes de fachada, exceto para o shell Bourne
tem algo para indicar qual shell que são - csh, o bash -
mas o shell Bourne é apenas sh.
Por quê? Esse foi o shell de origem.
Foi o Shell de então, não uma concha,
e uma vez que era a casca, não havia nenhuma razão para distingui-lo de outro shell.
Então é por isso que tem esse nome e ainda o faz.
>> Este top aqui é uma linha de um banco de dados de senha de uma conta que eu tenho lá
em outro computador.
Vou tentar obter esse nome para que você possa ver que parte no final, o shell.
O banco de dados de senha detém as características de login para todos os usuários.
No início é o nome de usuário, que você pode ver os últimos 2 cartas de meu agora.
Os campos aqui são separados por dois pontos.
O último campo, como você pode ver, é bin / tcsh, o shell.
Esse é o especificador de shell.
Há algo interessante aqui.
Quando Unix foi desenvolvido em primeiro lugar, havia apenas um shell,
então não havia escolha lá.
Então, por que eles permitem que um campo no banco de dados de senha para especificar um shell?
Eu não sei, mas é bom que eles fizeram.
É um pouco difícil de fazer mudanças no formato de banco de dados de senha
porque muitos programas referem-se a seu formato
e teria que ser reescrito.
É um desenvolvimento feliz ou fortuito que eles incluíram nesse campo.
Esse tipo de uma linha do arquivo de senha é usado em todos os computadores Unix e Linux, tanto quanto eu sei.
O Mac tem o seu próprio sistema.
Ele realmente tem um arquivo de senhas com as linhas em que formato,
mas isso não é o lugar onde as características do usuário são definidos.
Outra observação entre parênteses lá.
>> Se você está chamando uma concha, você pode chamá-lo como um sub-shell de suas conchas existentes.
Então, se eu ir aqui, vamos nos livrar dessas coisas.
Aqui estou eu no C-shell.
Essa variável, que identifica com precisão o meu escudo,
na verdade, nem sempre é uma maneira confiável de determinar o que desembolsar você está executando,
mas neste caso é.
E se eu simplesmente digitar -
Agora estou em Bash.
Algumas coisas vão ser os mesmos. ls diz-me os meus mandamentos.
Se eu a suspender voltar para o meu C-shell, sl, mesmo. Certo?
fg, primeiro plano, voltar para o meu shell Bash.
pwd, diretório atual, de volta para o C-shell.
pwd, diretório diferente - na verdade não é um diretório diferente neste caso.
É o mesmo diretório.
Vamos dizer que eu quero chamar um comando aqui: onde ls.
O que isso faz?
Diz-me onde o comando ls,
o que me dá uma listagem de diretório, está localizado na ls.
Vamos voltar para Bash shell. Vamos tentar a mesma coisa.
Hmm, interessante lá, onde: comando não encontrado.
Por que isso?
O comando onde está construído para o C-shell.
Este não é um comando que tem que ser lido para a memória de outro lugar e executado.
O C-shell executa-lo, transferindo a execução de parte de seu próprio código
e não é no shell Bash.
Então, Bash, não tendo tal comando integrado, procura por ele, não encontrá-lo,
e teremos um erro.
Portanto, temos um shell bash em execução em uma C-shell, e chamamos isso de um sub-shell.
E no caso de você estiver curioso, Bash shell tem sua própria maneira de localizar os comandos.
hash refere-se ao facto de que pode ser executada mais rapidamente,
sendo encontrados mais rapidamente.
Essa é uma das melhorias construídas em algumas dessas conchas.
>> Bourne tipo conchas são os preferidos para a programação.
Eles têm estruturas de controle como loops, instruções condicionais,
o tipo de comandos que você pode usar em linguagens de programação como C
ou qualquer outra língua. Talvez você esteja programando em Java ou qualquer outra coisa.
Shells ter os demais.
As conchas do tipo Bourne, particularmente Bash, têm mais
e eles são projetados com maior flexibilidade.
O Bash shell tem arrays. The Bourne shell original não faz.
Assim que pode ser consideravelmente vantajoso para a programação.
O C-shell realmente tem matrizes, mas não tem um monte desses outros recursos.
As conchas do tipo Bourne irá executar mais rápido
se eles não têm os elementos que se destinam a utilização interactiva.
Você carrega as coisas com um propósito, o que carrega-los para outra finalidade.
Há que trade-off lá.
Esses recursos que são destinados para uso interativo
realmente são de pouco ou nenhum uso de scripts.
É possível usar um sub-shell interativo assim como o que eu comecei lá
para testar os comandos que você pretende usar em um script.
Isso é o que você não pode fazer com perl. Você pode fazer isso com as conchas.
Mesmo as estruturas como loops e assim por diante pode ser executado de forma interativa.
Eles são ocasionalmente útil para executar de forma interativa,
mas é mais provável que você está usando para desenvolver um script.
>> Aliases.
Este vai ser sobre o C-shell.
Mecanismo de História, onde você voltar aos comandos anteriores
ou partes deles que você já tenha executado.
Mais uma vez, sobre o C-shell, o shell Bourne e shell Korn tem essas coisas,
mas eu não vou entrar na deles.
Então, aqui estão alguns aliases úteis que eu tenho.
Em vez de digitar ls - é um comando comum -
basta digitar l e salve-se um personagem.
ls com várias opções, todos os trabalhos.
Note-se que essas definições têm aspas em torno deles.
Nestes casos, as citações não são necessárias.
Se você pode definir os aliases sem as aspas, ele continuaria a trabalhar.
Eles são recomendados.
Há situações em que você não pode usar a citação
porque você quer que algo aconteça, que a citação impediria.
Às vezes, você pode citar parte da definição, mas não tudo isso.
Também é geralmente recomendado o uso de aspas simples ao invés de aspas duplas.
Aspas ter efeitos sobre as definições das variáveis,
particularmente levando-os a ser avaliada ao invés de impedir isso.
Por que iríamos querer parar a avaliação?
E como citações fazer isso por nós?
>> Aqui está um comando que você pode achar interessante.
'Ls g *'
g *, como você provavelmente sabe, é uma expressão curinga
para todos os nomes de arquivos que começam com g.
Se eu escrever em um comando ls g *, eu vou pegar uma lista de todos os nomes no meu diretório atual.
Se eu definir esse alias como é aqui com as citações,
ele irá executar esse comando no diretório atual onde você está executando-o.
Mas se você executar a definição de alias sem as aspas,
ele irá avaliar o curinga g * quando ele é executado este comando de definição.
Assim, a definição do alias será ls seguido pela lista de arquivos no diretório
em que o comando alias é executado,
independentemente de onde você realmente pretende executar o comando.
Este não é de grande utilidade, e as aspas prevenir a avaliação do asterisco.
Então você acabou de obter a definição de ser ls g *.
Então, quando você executar o alias, lgs, então ele coloca isso.
Agora não há citações, e ele irá avaliar o asterisco, quando você executar o comando alias.
Então, isso é uma coisa.
Aspas teria esse mesmo efeito aqui,
mas há outros casos em que as aspas duplas não funcionam tão bem.
>> Aqui é outra.
Você pode saber o comando grep.
O comando grep pode ser usado para digitalizar um arquivo para as linhas que têm determinadas seqüências.
Então, vamos passar por cima aqui e eu vou sair da minha concha Bourne.
Okay. Aqui está um arquivo.
Vamos dizer que é cordas abc grep. Aqui está.
Se eu fizer zddd grep, recebo nada. Okay.
Então, ele encontra uma corda, ele relata, que não encontra, não relatá-lo.
Ele produz qualquer linha que tem essa corda nele.
Há todos os tipos de opções aqui que você pode encontrar na documentação.
Aqui está uma maneira de fazê-lo.
E este aqui, aliás grabc 'grep abc'?
Isso vai incluir um argumento quando o alias é definido.
Então, se eu fazer isso aqui, agora se eu fizer grabc,
agora o alias inclui mais do que o simples comando. Ele também tem o argumento.
Até o momento que funciona.
Eu tenho um outro comando aqui, um presente, então esses são diferentes cordas em lá
e mostrar que isso não encontrar nada lá, uma vez que não corresponde.
>> E se eu quiser incluir na definição de alias do arquivo que eu vou procurar
e eu quero dar como um argumento para o alias a corda que eu estou procurando?
Eu poderia querer dizer abc como o argumento para o meu apelido,
mas o alias já determinado arquivo.
E é aí que esta expressão vem dentro
Observe aqui temos grep como antes.
Temos o arquivo aqui, strings.
\ ^!, Tipo de uma expressão estranha, acho que, se você ainda não viu isso antes.
Ponto de exclamação faz parte do mecanismo de história C-shell.
Ele pode chamar comandos anteriores, pode recordar argumentos para os comandos e assim por diante.
O mecanismo de histórico é utilizada como parte de serrilhado.
Se você especificar uma linha após o ponto de exclamação, ele irá se referir a essa linha na lista do histórico,
que não será metendo agora, já que é um assunto completamente diferente.
É possível especificar parte de uma linha.
Então! 03:02 seria o segundo argumento do número de comando 3.
O acento circunflexo aqui nesta expressão representa o primeiro argumento.
Se você não dar-lhe uma indicação de qual comando você está se referindo,
refere-se ao comando imediatamente anterior,
eo acento circunflexo é um símbolo para o primeiro argumento.
Porque é o acento circunflexo e não o número, você não precisa usar o cólon,
assim! ^ significa que o primeiro argumento para o comando anterior.
Um pouco confuso aqui.
Neste caso, quando você usa isso como uma definição de alias,
a referência história remete para os comandos em que o alias é usado.
Então, isso vai voltar um comando como uma operação de história,
mas como uma operação apelido refere-se ao comando em que você digita,
dizer, grstrings_file.
Temos as aspas aqui dentro. Qual é a barra invertida para?
Neste caso, como em outros lugares, nós não queremos para executar o mecanismo de histórico
enquanto a definição do alias.
Se não tivéssemos a barra invertida lá, o shell puxaria no primeiro argumento
do comando direita antes que correu este comando apelido, o que nós não queremos.
Queremos que este seja construído para o comando alias para chamar um argumento mais tarde.
As aspas simples não escapar um ponto de exclamação, a referência história.
Talvez você conheça a expressão fuga significa mudar o sentido da coisa.
Neste caso, isso significa alguma coisa para parar de ter um significado especial.
Significado especial do ponto de exclamação é história.
Fuja e não tem esse significado.
Citações não faça isso; barra invertida faz.
Então, nós estamos realmente usando dois níveis de escapar aqui.
Vou passar esse comando para a outra janela sem digitá-lo
usando essas operações de edição, que você pode achar útil.
Outra coisa aqui que eu vou te mostrar.
Se você acabou de digitar apelido sem argumentos, diz-lhe todos os seus argumentos.
Isso é um monte de apelidos eu já tinha aqui
além daqueles que eu tenho usado aqui hoje.
Mas se eu simplesmente digitar o nome de um alias, ele me diz o que significa.
Note-se que as citações sumiram ea barra invertida se foi.
Esta cadeia aqui é o resultado dessa definição de alias,
e agora tem apenas! ^ nele.
Isso vai olhar nas cordas de arquivo para qualquer coisa.
Então, se eu fizer cordas grstrings_file, eu não dar-lhe qualquer coisa para olhar para lá,
mas ele está olhando em cordas.
Ele não encontrou a palavra cordas nas cordas de arquivo, mas não encontrar abc.
E não acho que.
Então, aqui estamos dando um argumento que bate na definição do alias,
que está inserida nela.
É onde esta expressão vem.
Você pode usar mais do que 1.
O acento circunflexo é um símbolo para o primeiro argumento.
Se você quiser usar um segundo argumento, você, então, dizer: 2.
Não há nenhum símbolo especial para o segundo argumento.
E porque você está usando um numeral, você teria que usar o cólon.
Não é, no entanto, uma outra escolha aqui.
O sinal de dólar representa o último argumento.
E porque este é um símbolo, você pode omitir o cólon.
Portanto, seria o último argumento na lista.
E há também aquele.
Asterisk significa que todos, por isso esta é a lista de argumentos completa,
e, novamente, você pode omitir o cólon, porque não é um numeral.
Espero que esteja tudo observando tudo isso.
>> O mecanismo história pode voltar para as linhas anteriores na lista de histórico.
Você pode fazer isso em uma definição de alias.
Eu nunca vi este feito.
Ele teria o efeito de puxar os comandos anteriores da lista do histórico
quando você executa o alias, o que poderia ser diferentes comandos
dependendo de quando e onde você executá-lo.
É concebível que você pode querer sair dessa referência
só para saber o que um comando anterior era.
Eu nunca vi isso acontecer.
Suponho que alguém pode querer, mas isso é muito improvável.
Há uma outra coisa aqui.
Se você usar essa referência do tipo da história,
em seguida, são usados ​​apenas os argumentos para os quais existe uma tal referência.
Se você tem uma definição de alias que não usar uma referência do tipo da história,
se ele só se torna o início do comando
e você tem outros argumentos, então qualquer coisa que você escreva depois que
vai ser adicionado ao comando.
Neste caso, o exemplo que eu só dei lá, foi utilizado o primeiro argumento;
nós não usamos qualquer outro.
Se outros argumentos tinha sido dado na linha de comando, eles não seriam utilizados.
Então, se você usar a referência história em tudo, então você deve usá-lo para obter qualquer argumento.
>> Há uma outra coisa aqui eu só quero mencionar, em parte, entre parênteses,
ou seja, que este mecanismo de história, com o ponto de exclamação
vai voltar para o C-shell de origem.
O tcsh introduziu operações de história
que utilizam os tipos de comandos e cordas dos editores,
ou Emacs ou vi.
Minha opinião pessoal é Emacs é muito mais fácil de usar para essa finalidade
mesmo se você usar o vi para a edição regular.
Existem vários comandos do Emacs, que agora estão adaptados para a história.
Controle P recebe a linha anterior na lista do histórico.
Outra Controle P vai chegar o antes disso.
A seta para cima faz a mesma coisa.
Controle N obtém o próximo comando que você já tenha rolado para trás alguns aspectos.
Seta para baixo faz isso também.
Você pode mover para a esquerda para a direita com as setas e várias outras coisas.
Isso pode fazer uso do mecanismo de história
muito mais fácil do que usar a sintaxe ponto de exclamação,
mas você não iria usar isso em uma definição de alias.
Nós vamos passar por cima de que uma outra hora.
>> Variáveis.
Você sabe o que são variáveis ​​em linguagens de programação.
As conchas de tê-los também.
O C-shell usa o comando set para atribuir variáveis,
de modo que define a variável de um o valor de b -
como eu disse, uma definição inútil, mas uma ilustração de como este é utilizado.
O comando set irá criar uma variável se ela ainda não existir.
Os parâmetros posicionais para shell scripts podem ser considerados variáveis,
mas o uso deles e as regras para eles são um pouco diferentes.
Você não pode atribuir um valor para US $ 1 no curso de um script.
Você teria que definir uma nova variável para o efeito, se alguns de vocês queriam.
Digite set sem argumentos e você terá uma lista de todas as variáveis ​​atualmente definidas.
E vamos para o meu outro shell aqui e ver o que teremos se fazer isso.
Uma lista bastante longa lá, certo?
Vá para cima um pouco. Olhe para tudo isso.
Algumas destas coisas são definidas automaticamente pela shell.
O shell cria a variável e dá-lhe um valor.
Alguns deles são definidos pela casca, mas, em seguida, redefinida pelo utilizador
de acordo com suas preferências.
E alguns deles são criados pelo usuário de acordo com o que está fazendo naquele dia.
Isso é apenas um conjunto sem argumentos.
Há uma característica ímpar aqui dessa coisa.
Não tem que ser tanto sem espaços entre sinal de igual eo nome da variável
eo valor ou espaços em ambos os lados do sinal de igual,
como neste.
Isso não vai funcionar, e isso realmente é um comando válido
mas não vai fazer o que você pretende.
Esse comando irá funcionar, porque se você acabou de dizer e definir um nome de variável
sem sinal de igual ou conjunto e um nome de variável com um sinal de igual e nenhum valor,
ele vai definir a variável para um valor nulo.
Portanto, definir a = é um comando válido.
O comando set pode definir mais de uma variável na mesma linha.
Portanto, este comando aqui tem o efeito de definir tanto a e b para valores nulos.
Provavelmente não é o que você quer.
Este aqui, mencionado anteriormente, levará a um erro
porque = b não é uma expressão válida.
Um nome de variável não pode começar com o sinal de igual para igual.
E há estas outras coisas aqui.
Os dois pontos foram usados ​​para selecionar os argumentos de linhas de história,
e eles podem ser usados ​​- e eu não queria entrar em diante - para modificar as coisas.
Eles também podem ser usados ​​para modificar as variáveis ​​do escudo.
Este aqui, $ a, tem um valor.
: R vai decolar uma extensão.
Uma extensão será nada depois de um ponto,
um ponto e qualquer coisa que se lhe segue, no final de um arquivo,
apenas no final da lista após a última barra.
Então, eu tenho aqui.
uma é que. Ele vai cair o. O.
Se não há nenhuma extensão, apenas os caminhos após a última barra, ele não terá nenhum efeito.
a: h, essa expressão variável, vai decolar o último elemento de uma lista de diretórios,
novamente, somente após a última barra.
Então, / a / b / c torna-se / a / b,
mas este é alterado porque o elemento após a lista é nulo.
Aqui há algo que também eu quero enfatizar.
Estes qualificadores não procurar a existência desses arquivos.
Olham apenas para strings.
Estes destinam-se a manipular nomes de arquivos, nomes de caminho,
mas eles podem ser usados ​​em qualquer seqüência, mesmo se não é um nome de arquivo.
E eles não olham para a existência,
por isso, se não há tal arquivo, / a / b / c, isso ainda funciona.
Se é de alguma utilidade é outra questão, mas ainda funciona.
As variáveis ​​são diferentes no Bourne. Nós vamos chegar a isso mais tarde.
Sinal de dólar pode ser escapado assim como o ponto de exclamação e um asterisco.
Sinal de dólar pode ser precedidos por uma barra invertida ou as aspas simples.
Aspas duplas têm o efeito estranho em todas as conchas
de forçar a avaliação de um sinal de dólar expressão variável.
Então, se ele está sendo escapou de uma maneira, as aspas duplas pode ter o efeito
de fazer com que ser avaliada de qualquer maneira.
Isso é um pouco confuso.
Se houver vários níveis de fuga, tais como aspas simples dentro de aspas duplas
ou aspas duplas dentro de aspas simples, você deve testar para ver o que vai acontecer
a uma variável, se você estiver usando um.
Essas duas situações - o dobro dentro de interior único, single da dupla -
não necessariamente dar-lhe o mesmo resultado.
As variáveis ​​de ambiente, variáveis ​​C-shell ligados.
As variáveis ​​de ambiente também são variáveis ​​no C-shell,
e eles também são variáveis ​​em outros shells também.
No C-shell, eles são conjuntos distintos.
As coisas que eu estava dizendo antes são sobre variáveis ​​shell.
As variáveis ​​de ambiente são um conjunto distinto de variáveis
com a exceção de uma série de variáveis ​​que chamamos de variáveis ​​ligadas,
que são muito importantes e nós vamos entrar em quem mais tarde.
As variáveis ​​de ambiente são passadas automaticamente
de conchas ou comandos que são executados a partir de sua concha.
As outras coisas que não são. As variáveis ​​shell, os apelidos não são. As variáveis ​​de ambiente são.
É por isso que nós os chamamos de variáveis ​​de ambiente,
a idéia é que o ambiente ultrapassa apenas o seu shell atual.
Eles podem ser utilizados para definir as coisas para comandos.
Aqui é um exemplo. IMPRESSORA, LPDEST.
Ambas as variáveis ​​podem definir uma impressora que um comando vai usar para imprimir as coisas.
Se você tiver várias impressoras ao redor, você pode querer colocar o que você gosta.
A razão pela qual temos 2 variáveis ​​é que diferentes conjuntos de comandos foram escritos
usando estas diferentes variáveis.
Você pode dar-lhes valores diferentes.
O mais provável é que você vai dar a ambos o mesmo valor.
Essas coisas funcionam porque os comandos que fazem a impressão
foram programados para examinar os valores dessas variáveis.
Se um programa não foram escritas dessa forma, se fosse escrito para fazer outra coisa,
a variável seria irrelevante.
Assim, o sistema operacional não está olhando para estas variáveis
cada vez que você se referir a uma impressora.
Um comando que faz impressão é olhar para estas variáveis ​​se ele é programado dessa forma.
Essas variáveis ​​são frequentemente definidos em seus arquivos de inicialização
mas não necessariamente.
Você pode defini-los na linha de comando.
Eles podem ser definidos num comando.
Um comando que executa algo pode ter a sua própria seleção de variáveis ​​-
variáveis ​​que são exclusivas de um pacote de software específico, por exemplo.
Eles vão ser definidos quando você executar esse pacote.
Como essas variáveis ​​passados ​​para um sub-shell?
Quando um sub-shell é escrito, ele não escreve para essa área.
A área da sub-shell que se dedica a variáveis ​​de ambiente
não é escrito pelo sub-shell, que é escrito por cópia.
Quando você executa um comando comum, tais como os comandos para imprimir ou o que seja,
eles começam com a criação de um novo shell.
O shell cria um shell e, em seguida, substitui parte dela
com o comando que você está executando, o que é um pouco confuso,
mas é assim que estes comandos obter as variáveis ​​de ambiente
que, em seguida, referir-se a mais tarde.
O comando aqui para definir o setenv variável.
É assim que você definir. É 3 elementos: setenv, variável, valor.
Se você simplesmente setenv sem argumentos, o que você ganha?
Uma lista de todas as variáveis.
Novamente, é uma lista longa e agradável e, neste caso, como nos outros,
essas variáveis ​​são definidas em grande parte por minha operação de login pelo próprio shell
e não por qualquer coisa que eu fiz.
Há um outro comando aqui, printenv.
Isso também imprime o meio ambiente.
Observe esta última coisa aqui, EDITOR = vi.
Isso diz que, se eu estou usando algo que chama um editor
e eu não especificar um editor e ele me permite a escolha, pode me dar vi.
E se eu fizer EDITOR printenv? Diz-me o que é.
Bem antes disso, houve uma variável, MENOS.
Estas são as suas opções defaults quando eu executo o comando LESS,
que exibe os arquivos.
Então, se eu fizer isso, printenv pode demorar de 1 ou 0 argumento argumentos,
não mais do que 1.
Há outros comandos também, mas não vamos entrar em tudo o que hoje.
Lembre-se que foram os modificadores para as variáveis ​​de shell como: h,
que vai cair o último elemento de um caminho,
ou: r, que vai cair uma extensão.
Os que agora se aplicam às variáveis ​​de ambiente também. Eles não usaram.
Ela costumava ser que não poderia ser modificado. Agora eles podem ser.
É um dos avanços com a evolução das conchas ao longo dos anos.
Eu estava dizendo que as conchas, como parte dos ambientes
e variáveis ​​shell no C-shell são, com algumas exceções, conjuntos distintos.
Você pode estabelecer uma variável de ambiente e uma variável de shell com o mesmo nome.
Eles serão variáveis ​​diferentes, eles podem ter valores diferentes.
Alterar o valor de um não vai alterar o valor do outro.
Estas variáveis ​​são todos avaliados com o cifrão - $ a, $ o que quer.
Assim que se você tem isso? Você sabe qual deles você consegue?
Em meus testes eu tenho a variável shell,
mas isto não é documentado e você não pode contar com isso.
Então eu lhe pergunto, é a criação de variáveis ​​shell e meio ambiente
com os mesmos nomes uma boa ideia? Não. Tudo bem.
O que são essas as principais exceções em que as variáveis ​​do ambiente e shell
estão ligados um ao outro?
Existem estes 4.
Carta Capital variável de ambiente TERM,
desembolsar variável termo em letras pequenas, o tipo de emulação de terminal.
Eu só vou passar por cima aqui e eu vou fazer eco, um comando útil aqui,
$ $ TERM prazo. E lá.
xterm é um tipo de terminal para janelas exibidas no Sistema X Window.
xterm-cor é uma variação do que a que permite que as cores diferentes.
Por que é que vamos definir isso? O que é isso bom?
Comandos que reorganizar a tela como o editor
enviar sequências particulares, chamados de seqüências de escape,
a um terminal ou uma janela para reorganizar-lo e assim por diante.
Essas sequências são diferentes para diferentes tipos de terminais.
Isto diz-lhe quais usar.
Às vezes, há problemas lá.
Você pode querer mudar isso.
Se as coisas não estão funcionando, por vezes, o tipo de terminal está configurado errado,
você pode ser capaz de corrigi-lo, redefinindo a variável prazo.
Nestes casos, a alteração de uma variável, a variável de ambiente ou a variável de shell,
deve alterar o outro.
Eu descobri através da experiência que a mudança de prazo em letras maiúsculas
nem sempre mudar shell variável termo em letras pequenas.
Este é um bug.
Eu não sei se isso é sempre verdade. Na maioria das vezes isso não é verdade, mas pode ser.
Então, se você fizer uma alteração, basta verificar isso.
Não é sempre que você precisar alterar esse valor, mas de vez em quando você faz.
USUÁRIO variável de ambiente.
Mais uma vez, variável de ambiente em letras maiúsculas, a Shell variável em letras pequenas.
Este é o seu nome de usuário.
É só em circunstâncias muito excepcionais
que você gostaria de mudar isso.
Se o seu nome de usuário é outra pessoa, ele pode lançar todos os tipos de coisas.
Diretório home, o diretório home do usuário.
Novamente, você não gostaria de mudar isso.
Repare em todos esses casos e esse que nós estamos prestes a cobrir, a variável de caminho,
variável de ambiente é em letras maiúsculas ea variável shell ligado é em letras pequenas.
Se você alterar um, você deve mudar o outro.
Este tipo de ligação não pode ser estabelecida como você não pode ligar duas variáveis,
Para além destas quatro, ea ligação destas variáveis ​​não pode ser desfeita,
você não pode separá-los.
Então, esses quatro pares de variáveis ​​são vinculadas.
Eles sempre serão. Nenhum outro será.
Além disso, seria possível a criação de variáveis ​​com os mesmos nomes
dos tipos opostos.
Você poderia fazer um termo variável shell em letras pequenas
ou uma variável de ambiente TERM em letras maiúsculas.
Essas variáveis ​​seria independente destas variáveis ​​binárias
e seriam independentes uma da outra.
Eu não posso imaginar por que você faria isso a menos que queira confundir as pessoas.
Este aqui, variável de caminho, este é um muito importante.
Outra coisa é que não pode haver casos
de variáveis ​​com nomes emparelhados similares que não estão ligados uns aos outros.
Não pode haver variáveis, Shell e Shell, em letras maiúsculas e minúsculas.
Com base nesse nome, você não sabe se essa variável é uma variável shell
ou uma variável de ambiente, e eles não estão ligados um ao outro.
Então, esse tipo de pares de nomes não implica variáveis ​​ligadas.
A variável de caminho, que eu estava mostrando antes,
é uma lista de nomes de caminho no qual o shell procura por comandos.
Vamos acabar com a esta janela aqui e vamos fazer echo $ PATH, letras maiúsculas -
variável de ambiente - echo $ caminho, letras pequenas - Shell variável.
Observe que a lista de diretórios é a mesma. Estes estão vinculados.
Mude um, você mudar o outro.
Na variável de ambiente os elementos são separados por dois pontos. Observe que.
As variáveis ​​shell são separados por espaços.
Esta variável de ambiente é uma única seqüência.
A variável de shell é uma matriz.
The Bourne shell não tem arrays.
Bash faz, mas isso já é uma parte fixa da shell.
Esta é uma seqüência única e não um array.
O C-shell sempre teve matrizes.
As matrizes são muito mais fáceis de se trabalhar.
Você pode se referir a partes dele.
$ Caminho Então echo [1] e eu recebo / usr / bin, o primeiro elemento.
Mais uma vez, lembre-se sinal de dólar representa o último elemento da lista de histórico.
O que acontece lá? Ele tentou encontrar cifrão como um símbolo variável.
Eu escapar. Opa. Não levaria o que quer.
Algumas destas coisas não funcionam tão bem.
Talvez nós vamos deixar isso para fora.
Asterisk refere-se a coisa toda, mas é o que você ganha se você não especificar um elemento.
Outra maneira que as variáveis ​​de matriz podem ser manipuladas,
número de elementos de lá, 7 elementos.
Aqui nós colocamos o sinal de libra antes do nome da variável.
Aqui está mais um. Coloque um ponto de interrogação lá.
Isso é um valor lógico. Isso indica que a variável existe.
É uma outra maneira de trabalhar com variáveis.
Isso, por sinal, não tem que ser uma variável de matriz.
Isso poderia ser qualquer variável.
E se eu fizer isso, não há tal variável e eu recebo um 0.
Outra pequena coisa lá sobre as avaliações de variáveis.
Voltar a este aqui, se por algum motivo você queria trabalhar com esta
ao invés de trabalhar com a matriz, a variável de shell,
existem comandos que podem separar estas coisas baseado no cólon.
Na verdade, se você está indo para estar fazendo isso no shell Bash, possivelmente,
algum tipo de script, que seria, provavelmente, como você faria.
Mas no C-shell é muito mais fácil de usar a matriz.
No shell Bourne, as variáveis ​​são atribuídos por uma única expressão como esta,
como a maneira que você pode atribuir uma variável em uma linguagem de programação,
e aqui não deve haver espaços.
É necessário que seja apenas uma string.
Nos shells Bourne do tipo, todas as variáveis ​​são variáveis ​​shell.
As variáveis ​​de ambiente são um subconjunto das variáveis ​​shell.
Distinguem-se das variáveis ​​não-ambiente através da exportação.
O comando para fazer isso é a exportação, como IMPRESSORA exportação.
Se tivéssemos que definir tal variável,
se queria um comando de impressão para encontrá-lo, ele teria que ser uma variável de ambiente,
e é assim que nós torná-lo um.
Aqui há algo meio confuso.
Esta expressão, a exportação para o meio ambiente, deriva deste conceito shell Bourne,
e ainda que a expressão é usada em descrições do C-shell,
onde não existe tal comando como de exportação.
Se você acabou de dizer exportação por si só, você tem uma lista de exportação -
Então, se eu simplesmente exportar aqui, não há tal coisa.
Ok, lá vamos nós.
Essas coisas, aliás, também são definidos pela shell.
Eu não definir qualquer um desses por mim mesmo.
A concha faz todos os tipos de coisas por si só.
Ele deve fazer as coisas automaticamente.
No Bash ou Korn, você pode executar um comando como este,
que ambos dão uma variável um valor e exportá-lo em um comando.
No shell Bourne eles têm que ser comandos separados como uma exportação.
Aqui é um outro aspecto que é confuso.
O comando set no C-shell define as variáveis
e sem argumentos lhe diz que os valores das variáveis ​​são.
No shell bash, o comando set sem argumentos faz a mesma coisa,
mas com argumentos que ele faz algo completamente diferente.
Então, esses são os vários argumentos aqui.
Alguns destes são variáveis ​​de ambiente, alguns deles são variáveis ​​shell.
Todos eles são variáveis ​​shell realmente. Alguns desses são variáveis ​​de ambiente.
O comando set com argumentos podem ser usados ​​para operar
sobre os parâmetros posicionais para um script,
que é uma maneira de fazê-los todos de uma vez.
Nós realmente não podemos entrar nesse hoje.
Ele também pode ser usado para alterar o comportamento do reservatório.
Particularmente em Bash existem variáveis ​​que irão determinar a forma como o shell se comporta.
Em seguida, também apenas este comando que você pode ver, este comando.
Typeset seguido de variáveis ​​e tipos de variáveis ​​é usado nos shells Korn e Bash.
Não é obrigatório, mas pode ser usado para restringir os valores de variáveis,
que pode ser útil para evitar erros, e é bastante comum.
Então, eu só estou mencionando que no caso de você vê-lo em algum lugar.
O comando onde.
Lembra que eu mencionei anteriormente o comando onde no C-shell,
que pode dizer a localização de um caminho de comando.
Aqui está a substituição de comando.
Você deve encontrar no seu teclado em algum lugar um personagem que se parece com isso.
A localização no teclado vai variar.
Nós chamamos isso crase. É aproximadamente o tamanho de uma citação.
Ele vai da esquerda superior para a direita inferior.
Aqui no meu teclado Mac é no canto superior esquerdo.
Este carácter pode ser usado para executar um comando dentro de um comando.
Se você tiver uma expressão dentro de crase,
essa expressão é um comando, é executado.
A saída do comando
é, então, substituído por toda a expressão backquote
dentro de um comando mais longo que executa com que a produção
como parte de sua série de argumentos e assim por diante.
Aqui está um comando que usa isso.
Vamos demonstrar a operação aqui.
Vamos aqui, tirar os crase.
Controlo A me chega ao início da linha com a sintaxe de edição Emacs.
Até agora, o caminhos é o que faz,
mas quando eu faço isso como este, em seguida, liga nessa lista de nomes de caminhos
no lugar da expressão backquote todo e corre ls-l sobre eles.
Kind of conveniente, não é?
Então, isso é uma coisa legal. É assim que funciona crase.
Agora vamos descer um pouco mais.
Estes são aliases. Na verdade, eu usá-los.
Vou tentar conseguir isso em com uma operação de edição.
Okay.
Agora vamos ver como essas definições saiu.
apelido LWH me dizendo como ele é definido.
Repare que é apenas isso, mas as cotações externas foram retiradas
eo ponto de exclamação é retirado.
*, A lista completa de todos os argumentos.
Em uma definição de alias ele será aplicado de volta para onde eu uso isso.
LWH ksh bash. Okay.
Veja como isso funciona? Isso me poupa algum digitação.
Vamos subir um pouco apenas para mencionar outra coisa aqui.
Observe aqui essas diferentes conchas. Eu deveria ter mencionado isso antes.
A CSH tem um 2 aqui e assim que faz / bin / tcsh.
Poderíamos estabelecer por outros meios que aqueles são realmente o mesmo arquivo.
Lembre-se que eu estava a dizer, se você digitar sh você começa bash.
Digite isso e você conseguir isso.
Mas aqueles que não estão ligados. Aqueles que os solteiros lá.
E isso não é o tipo de arquivo que pode chamar outra.
Portanto, estas são arquivos separados, sendo que os C-shell são o mesmo arquivo.
Voltar aqui em baixo, o outro aqui, este alias,
note que está sendo executado este comando, arquivo.
Esse apelido que corre. Arquivo informa o tipo de um arquivo.
Festa ksh Então FWH. Okay.
Essa é a saída do comando file.
Eu não sei se você sabe o que isso significa aqui,
Mach-O binário universal com 2 arquiteturas.
Há dois possíveis tipos de processador no Mac,
e alguns programas foram escritos para ser capaz de executar com ambos,
eo comando arquivo pode determinar que, de modo que é o que este significa.
Ambos os arquivos foram escritos dessa forma.
Assim, vemos como o alias funciona, ver como a crase funciona,
vemos como os ls arquivo reais ou arquivo funciona.
Isso pode não funcionar. Tente ", onde onde" e "LWH onde". Ok, vamos tentar isso.
onde para onde.
onde é um shell built-in.
Lembre-se antes mostramos que Bash não tinha onde.
Se você digitar onde no shell bash, você recebe uma mensagem de erro.
É apenas uma parte da casca ao invés de ser um comando separado.
O que acontece se eu digitar LWH procurando onde? Veja o que acontece lá.
Ran onde onde, tenho essa saída e, em seguida, tentou correr ls
como l de onde é um shell built-in.
onde está lá, mas os outros não existem.
Nenhum deles existe, na verdade.
De modo que nem sempre funciona, e também ilustra como algumas coisas
não fizer exatamente o que você poderia ter pensado.
Vamos descer um pouco mais aqui.
Isso aqui é em Bash. Essa é também a substituição de comando como a crase.
Mas ao contrário de crase, ele usa este estilo variável.
Há uma série de expressões que começam com um cifrão,
e quando estes não são variáveis, eles emprestado o uso do sinal de dólar
para indicar a expressão de algum tipo.
Isso pode estar entre parênteses ou colchetes ou parênteses duplos,
que tem uma finalidade diferente.
Solteiro parênteses aqui são uma substituição de comando, assim como os crase.
Parênteses Casal é realmente uma operação aritmética.
Há outras sintaxes, outras operações.
Sintaxe crase está disponível em Bash.
No entanto, esta é preferível. É muito mais fácil de ler e permite o assentamento.
Você pode ter dentro de $ (comando) outro comando,
algo como -
Recebo uma lista lá.
Isso funcionaria se eu tivesse a crase também.
E se eu quiser fazer algo parecido -
Você provavelmente não iria realmente usar este comando,
mas esta substituição comando interno ecoa os nomes de todos os arquivos começando com um,
então este é executado ls-l nesses arquivos,
e, em seguida, este apenas ecoa a saída.
Você provavelmente não iria fazer isso, você tinha acabado de fazer o eco ou ls,
mas isso mostra como a nidificação de comandos funciona.
Então, só uma outra característica aqui.
Eu mencionei isso antes, que quando você tem onde no C-shell,
digite obras nas conchas Bourne do tipo para localizar comandos.
Comandos internos, o que eu estava dizendo lá.
Os comandos são parte do shell, como onde.
Quando o shell executa um comando como ls, ele localiza-lo através do caminho,
encontra-lo em algum diretório em algum lugar,
lê-se que para a memória, cria um novo shell,
lê o comando ls ou o que quer para o shell
onde as variáveis ​​de ambiente já estão localizados,
e, em seguida, transfere a execução a ele.
Built-in de comando, o código para que o comando está dentro da casca,
para que o shell só começa a executar parte de seu próprio código.
onde está o tal comando. Ele realmente fica mais rápido.
Ele não tem que ler qualquer coisa na memória, que já está na memória.
Comandos internos sempre têm precedência sobre os comandos com o mesmo nome.
Os comandos que estão em diretórios no caminho pode ter o mesmo nome,
comandos em diferentes diretórios, arquivos em diretórios diferentes.
O que ocorre no início do caminho é o que você vai conseguir.
Se não houver um comando embutido, você sempre buscá-la.
Não há maneira de dar-lhe uma prioridade menor do que um comando no caminho.
Se você deseja obter esse comando caminho, você pode digitar o caminho completo.
Se houvesse um comando, onde o caminho algures,
você pode digitar / bin / onde e que você obtê-lo.
Se você não quiser digitar todo o caminho, você pode definir um alias.
Na verdade, se você deu o alias o mesmo nome que o comando embutido, ele iria trabalhar
porque a definição do alias é avaliada
antes do shell determina que é um comando embutido, que deve ser executado.
Então isso fica um pouco mais complicada, com alguns comandos aqui.
O caso de alguns comandos são realmente comandos embutidos no e no caminho.
Um deles é o eco, o comando eu usei apenas um pouco atrás nesses exemplos.
Eco é um comando no caminho e é em cada concha.
Eles não necessariamente todos se comportam da mesma maneira.
Ele foi originalmente um comando único no caminho.
Foi construído para as conchas mais tarde.
Porque existem opções que dependem do ambiente
e as opções de linha de comando, os comandos internos
foram escritos para funcionar o mesmo que o comando que estava no caminho,
é improvável que teria sido escrito dessa forma
se o comando já não tinha sido escrito para o caminho.
Então, isso tem efeitos colaterais. Sua história tem efeitos aqui.
Há opções lá.
Há também uma opção definida por uma variável no tcsh chamado echo_style.
Essa é uma dessas variáveis ​​que podem mudar a maneira que ecoam obras.
Há outros casos em que você pode atribuir uma variável
que muda a forma que a operação de shell, incluindo um comando integrado, funciona.
Ele não afetará qualquer outra coisa
uma vez que outros comandos não têm acesso às variáveis ​​shell,
apenas as variáveis ​​de ambiente.
Mas as operações de shell pode ler as variáveis ​​de shell.
Isso não vai funcionar para csh. Isso é apenas tcsh. Essa é uma das melhorias.
Análise de seqüências tem quando se avalia metacaracteres
quando se avalia as variáveis, aliases, referências de história.
Há uma seqüência específica para estas coisas.
Se ele faz as coisas de uma determinada seqüência
e chega a algo que é uma expressão de uma espécie
que já tiver sido avaliado, ele não irá avaliar-lo novamente.
Se ele recebe-lo, então ele só vai passar os personagens.
Então, se a avaliação de algumas expressões, como substituição de comando
ou variável ou o que dá origem a uma expressão
que você gostaria de ser avaliado,
que só funcionará se que a avaliação ocorre mais tarde na seqüência.
Espero que eu estou sendo claro lá.
Essa seqüência de análise, uma operação no C-shell,
não é o mesmo para comandos internos quanto para os não-incorporados comandos.
Eu não tenho certeza sobre Bash lá.
Por exemplo, se uma variável shell produziu uma referência história,
ele provavelmente não iria voltar na história.
Seria apenas obter o ponto de exclamação.
Na verdade, podemos apenas tentar isso agora.
definir a = e nós vamos ter que colocar isso aí.
Oh, espere. Desculpe. Eu fiz isso no Bash. Eu queria fazê-lo aqui.
Veja-se, por isso, não avaliou que a referência história
porque já tinha passado o ponto de avaliar expressões de história
quando se avaliou a variável.
Então, isso é um efeito de análise.
E, novamente, comandos internos não são feitas da mesma forma.
Tudo bem. Vamos para o próximo aqui.
Este destina-se a ser uma linha, mas está tornando-se mais fácil de ler.
O que isso faz?
Você deve se lembrar de que podemos avaliar asteriscos como curingas filename,
e há outros wildcards filename como o ponto de interrogação e expressões de colchetes.
Esse tipo de avaliação é chamado de englobamento.
definir noglob no início deste comando diz para não fazer isso.
noglob unset diz voltar a fazer isso.
Note-se que conjunto glob não teria esse efeito.
Em linguagem comum, definir glob ou noglob unset parece ser equivalente,
mas aqui não é. É noglob desactivado.
Agora TSET. tset representava conjunto terminal.
Não é usado, que muitas vezes agora, mas antes que os sistemas de janelas tornou-se disponível
e você tinha um único terminal, você pode ter que determinar o tipo.
E se alguma coisa estava vindo uma rede Ethernet ou da rede,
você pode querer dizer que é um vt100.
VT100 é uma espécie de padrão no negócio terminal. Ele vem do terminal DEC.
Se você acabou de fazer discada - percebeu isso? Isso remonta um longo caminho, não é?
Então, se nós simplesmente TSET aqui,
se eu só faço tset, está redefinindo o meu terminal, mas você não viu nada.
Ele realmente não muda nada.
-S
Okay.
PRAZO setenv xterm-color.
Nós já sabemos que o termo foi criado dessa maneira, de modo que não se alterou.
Essa é a maneira que gostaria de fazê-lo.
Mas note que este comando, tset-s, apenas saída desses comandos. Ele não executá-los.
Não execute estes comandos, mas a saída deles.
Portanto, este se destina a produzir comandos que será executado.
Você se lembra do comando nesse arquivo que acabei de mostrar que tinha um Q nele.
Então, vamos fazer isso.
O Q suprime alguma saída, mas isso não importa aqui, como você pode ver.
Eu só estou fazendo isso para mostrar que isso não importava.
Isto está em sintaxe crase.
Note-se a crase aqui, crase aqui.
Estou omitindo essas coisas aqui.
Estes são casos de dizer o que fazer
no caso de certos tipos de terminais -
Ethernet, rede dial-up, o que você tem.
Não importa aqui, porque nós não estamos realmente fazendo qualquer uma dessas coisas.
Eu só estou ilustrando o comando.
Se eu fizer isso com a crase, o que é que eu vou conseguir?
Além disso, observe aqui que este incluiu a noglob conjunto ea noglob desactivado,
Portanto, estas são agora redundantes na definição.
Isso nem sempre é verdade, mas agora eles estão incluídos neste comando.
Mas vamos ver o que acontece se eu fizer isso
e vá para o início da linha com controle A e eu faço isso.
Ok, definir: Comando não encontrado. Isso é meio estranho, não é?
conjunto é um comando conhecido. É parte da casca.
definir: Command not found? Por que isso?
Hmm. Bem, vamos pensar sobre isso.
Está funcionando uma substituição de comando crase,
e que ocorre com uma certa parte da sequência de analisar o comando.
conjunto é um comando embutido.
Então, no momento em que ele faz isso substituição de comando,
ele já conseguiu passar o ponto de identificação de comandos internos.
Por isso, trata definido como se fosse um comando no caminho.
Escusado será dizer que ele não encontrá-lo, e você obterá um erro.
Well. Há um exemplo de seqüência de análise.
E o que vamos fazer sobre isso?
Observe este comando muito interessante aqui, eval.
Eu me pergunto o que faz.
Se você olhar para o manual - e vamos fazer isso
para mostrar o quão confuso esses manuais são -
homem tcsh, manual confuso, encontrar as coisas por aqui não é fácil.
Aqui vamos nós, eval arg, para que possamos ter um ou mais argumentos
e há uma lista de coisas lá.
Trata os argumentos como entradas para o shell
e executa os comandos resultantes no contexto do reservatório actual.
Isso geralmente é usado para executar comandos gerados como resultado do comando
ou substituição de variáveis ​​de análise, porque ocorre antes estas substituições.
Muito bom.
E aqui eles ainda se referem ao comando tset para um uso amostra
como a que eu acabei de mostrar.
Agora eu tenho que obter a janela de volta a um lugar útil.
Vamos começar por aqui e vamos ver o que eval é usado um pouco antes disso.
Então, vamos ver o que acontece se colocarmos - aqui vamos nós com as setas para que o comando
e controlar um ao início, eval.
Ok, então ele funciona.
Quando você faz eval, leva o que vem depois ea torna um comando.
Isso permite que você analisá-lo essencialmente duas vezes.
A seção aqui executa esse comando dentro da crase,
recebe a saída.
A saída é suposto para ser executado como os comandos aqui como estes
a este e este.
Assim, os comandos são agora aqui nesta seqüência,
mas estes são comandos embutidos no e não pode obtê-los de imediato.
Então vamos para eval, eval pega aquilo, a coisa toda começa tudo de novo, e ele funciona.
Um exemplo tanto de backquoting, eval, análise, consequências de análise,
e um comando que é provavelmente de muito pouca utilidade para você hoje em dia.
Okay. Tudo bem, umask.
Vejamos este comando aqui, umask 022. Eu me pergunto o que faz.
Vamos apenas digite umask com nada depois. 22. Okay.
022 e fazê-lo novamente.
Como você deve ter adivinhado, umask sem argumentos diz-lhe a máscara atual;
umask com argumentos que o torna, mas isso era o que eu já tinha.
O que 022 significa?
Estes são aqui as proteções para um arquivo.
Eles determinam quem tem permissão para ler, escrever ou executar o arquivo.
Proteções são também chamados de permissões.
O r significa leitura, o w para gravação,
e x, que não está presente ali, está para ser executado.
Existem 3 categorias de lá.
Os últimos três elementos estão na categoria de usuário. Aqueles aplica a mim, o usuário.
Estes três aqui se aplicam ao grupo.
O arquivo pertence a um grupo, o usuário pode pertencer a vários grupos,
mas se o usuário está no grupo ao qual este arquivo pertence,
em seguida, essas proteções serão aplicadas a ele, se ele não é o usuário.
E esta é toda a gente.
Essas categorias são mutuamente exclusivas.
As proteções usuário se aplicam a ele,
as proteções de grupo se aplica aos membros do grupo que não o usuário,
e as outras proteções só se aplica a outros que não o usuário e os membros do grupo de pessoas.
Se houver um r ou aw ou um x, isso significa que a proteção é concedida.
Se há um hífen, isso significa que ele não é.
Há, na verdade, são outras coisas que podem ser colocados aqui para além destes,
que eu não vou entrar agora.
A umask define um padrão para os arquivos que você criar.
E, como uma máscara, basicamente ele diz que os bits que você não definir.
Como é que isso se torne pedaços?
Se você pensar em cada um deles como um número octal,
este é o bit de 1s, este é o 2s, este é o 4s.
Então, de 0 a 7
irá descrever o que combinação de r de, w do e X do que você tem para estes 3
e, em seguida, um número semelhante para estas e, em seguida, para estes.
Então, 022 significa 0 para a outra, para o grupo 2, 2 para o utilizador.
Mas esta é uma máscara. A máscara é o que você não tem.
Sinto muito. Eu apenas dei-lhe coisas na ordem errada.
É a primeira 3. Estes são três o utilizador, estes três são o grupo, estes três são o outro.
Desculpe eu te dei estes na ordem errada.
O 0, que é o primeiro desses, não exibe o valor,
mas se um número não é lá, é um 0.
Isso significa que todos os 3 destes seria permitido.
Observe que nesse particular o x não é permitido.
A razão é que o reservatório é capaz de determinar
se um arquivo deve ser executado ou não.
Uma vez que este não é um arquivo executável, ele não definiu o x.
Os dois meios que escrever permissão, a segunda categoria aqui,
a do meio, é negado.
Então, novamente, estas são as coisas que ele negou.
Bem, x é permitido, mas não é aqui, porque não é executável
e da mesma forma para os outros.
Então isso é um umask comum.
Outro comum é de 700 - dar-se tudo e ninguém mais nada.
E há outras possibilidades.
Eu vou voltar a isso. Usando a história posso pesquisar para trás, para isso, LWH de lá.
Okay. Então, aqui, essas são as conchas.
Bash, o proprietário que é conta do sistema, pode fazer tudo.
Grupo e todos os outros podem fazer ler ou executar, mas não escrever.
Este nem sequer permitem que o proprietário de escrever para ele.
Se o proprietário queria escrever para ele, a conta do sistema,
ele teria que mudar a proteção primeiro.
Mas, novamente, o umask define o padrão, mascarando-o,
indicando os bits que não serão criados.
Isto é tipicamente em um dos seus arquivos de inicialização, que é o. Cshrc para o C-shell
ou o perfil. por as conchas Bourne tipo.
Ele pode ser também em outros lugares, se existem outros arquivos de inicialização do sistema.
De qualquer forma, isso é umask.
Há algo meio estranho aqui,
e que é, porque é que há um único comando para isso?
Se eu estivesse escrevendo isso, eu faria uma variável, umask = algum valor.
Porque é que existe um comando inteiro apenas para esta finalidade?
A razão é esta só vai voltar às origens do Unix.
Unix era apenas um projeto de programação no Bell Labs no início de 1970.
As pessoas simplesmente se reuniram para programa.
Eles nunca pretenderam que ele se torne um sistema operacional de todo o mundo.
Diferentes pessoas escreveram diferentes partes sem pensar muito
de como eles estavam indo para ser usado - em vez esboçado.
E veio junto assim, e ainda é assim em alguns aspectos.
Então, que reflete a história, e ainda existem estas inconsistências e elementos ímpares do mesmo.
Okay. Next one aqui.
Como escrevi anteriormente, o C-shell não é realmente muito usado para programação,
embora possa ser.
Ele executa mais lentamente, mais uma vez o trade-off entre o uso interativo,
que tem mais do que a velocidade de processamento envolvido,
que pode fazer sem o processamento.
Os recursos extras adicionados ao shell Bourne pelo Korn e Bourne-Again conchas
parecem não atrasá-los, e eu não sei por que isso acontece.
Poderia ser apenas uma melhor programação, mas eu não estou em posição de saber.
Acelerar aqui, na verdade, não é um negócio tão grande, embora seja mencionada.
A razão é que scripts shell realmente ficar bastante rápido.
Se houver um monte de comandos como em um programa de calculacional,
você provavelmente não iria fazê-lo em um script shell.
As operações que são bastante simples e direto.
Os que eu experimentei que são demasiado lentos
envolvem aplicações repetidas de comandos lentos.
Mencionei o editor de fluxo sed. Esse comando é lento.
Se você executar várias vezes sed, você vai ter um script lento, mas não é o shell que é lento.
Executá-lo no shell Bourne não será muito mais rápido do que executá-lo no C-shell,
embora haja talvez algumas vantagens lá.
As capacidades de programação adicionais, por outro lado,
são razões significativas por que você iria usar as conchas do tipo Bourne.
C-shell tem características ímpares para isso -
o fato de que você não sabe se uma variável é uma variável shell ou uma variável de ambiente.
Ele pode ser muito confuso.
Não é tão fácil de escrever
apenas com base em sua experiência de programação em outras línguas.
Eu acho que você pode encontrar as conchas Bourne tipo mais consistente com a sua experiência.
Alguns scripts, porém, pode haver milhares de linhas de comprimento.
Aqueles que eu vi são usados ​​para remendar sistemas operacionais.
Aqueles podem executar muito lentamente, mas você não executar aqueles com muita freqüência.
É só quando você está fazendo correções,
e é apenas o gestor do sistema que faz essas coisas,
por isso não é realmente um grande problema.
Aqueles que são centenas de linhas de longo realmente executar rapidamente.
Mencionando isso aqui, quais são essas melhorias?
Eu já mencionei alguns deles - arrays, cálculos,
os $ () de expressão para cálculos no shell bash,
o outro tipo de substituição de comando.
Existem diferentes tipos de comandos de teste
pelo qual você pode fazer testes condicionais sobre a existência de um arquivo ou outras coisas.
Última visita, este comando aqui.
O que isso faz, e por que alguém iria usá-lo?
variablename printenv.
Nós sabemos o que printenv faz. Diz-nos o valor de uma variável.
E variablename printenv não nos dizem muito, porque não há tal variável.
Em branco.
Mas vamos dar-lhe algo significativo.
Isso não é lá também. Okay. Acho que nunca definiu que.
Vamos verificar o meu ambiente.
Este é outro comando pelo qual você pode inspecionar seu ambiente.
Há boas EDITOR de idade, o que vimos antes.
O que isso faz?
Aqui temos uma expressão de crase.
Lembre-se esta é a C-shell.
Então EDITOR printenv nos dará um valor de EDITOR. É vi.
E, em seguida, ele irá definir o valor para a variável a, o comando set.
Portanto, agora se eu faço echo $ a, eu recebo vi.
Isso não parece muito útil.
No entanto, ele realmente tem um propósito.
Desde que nós não sabemos se a variável é uma variável shell ou uma variável de ambiente
usando a sintaxe avaliação cifrão, podemos usar printenv
para certificar-se de que é uma variável de ambiente.
Então, se houvesse um editor variável shell, isso não teria conseguido.
Isto funciona apenas com a variável de ambiente.
Se houvesse uma variável shell e eu queria que o seu valor,
Eu teria que encontrar outra maneira de fazê-lo.
Uma maneira de fazer isso seria fazendo conjunto e tubagens.
Este é um dos metacaracteres, caracteres especiais.
Ele envia a saída do conjunto para outra coisa.
Vamos ver o que podemos encontrar lá.
Nada. Okay. Vamos ver o que está lá todos juntos.
Foi echo_style, aquele que eu mencionei antes. Ok, vamos fazer isso.
Lembre-se que eu mencionei antes, echo_style
determina a forma como o comando echo será executado.
BSD significa Distribuição Berkeley padrão.
Este é o Berkeley Unix a partir dos anos 1970.
Essa é uma das formas que ecoam pode ser executado.
Definir echo_style a esse valor no TC-shell fará eco para se comportar dessa maneira.
Portanto, definir faz isso, mas só recebe definir variáveis ​​shell.
Ele não iria encontrar EDITOR, que não é uma variável shell.
Nada.
Então essa é uma maneira de distingui-los.
Mas o fato de que você tem que passar por algum comando estranho assim
distinguir entre variáveis ​​shell ou variáveis ​​ambientais
mostra o tipo de natureza impraticável do C-shell para algumas finalidades.
E agora, por último e talvez menos, isso é as páginas do manual.
Aqueles de quem você deve saber, o homem é o curto comando para manual.
As páginas de manual para as conchas são difíceis de ler. Eles são muito longos.
Eles estão organizados de uma forma que pode tornar difícil para encontrar o que você está procurando.
Então, se você está procurando algo com um propósito,
você não pode saber se o efeito é uma variável shell ou outra coisa,
assim você pode não saber para onde olhar para ele.
Você pode olhar para várias cordas, mas as cordas são muitas vezes repetida.
Por isso, é geralmente difícil de ler.
Nós apenas olhou para a página man TC-shell um pouco antes de encontrar o comando eval.
Algumas coisas andam mais rápido.
Uma abordagem é a busca de uma string.
Você pode usar o pager.
Pager tem a barra para procurar um comando ou uma seqüência dentro de uma operação de pager.
Homem por padrão usará pagers, ou ser mais ou menos.
Eu não sei se você está familiarizado com esses, mas esses podem mostrar arquivos pouco a pouco.
Eu tenho usado a menos para exibir esses arquivos particulares que temos aqui.
Você pode procurar lá dentro.
Você pode tentar usar diferentes seqüências de pesquisa.
Também páginas de manual em diferentes sistemas operacionais podem não ser os mesmos.
Eles podem ser páginas separadas para csh e tcsh.
Eles não estão no Mac, mas eles poderiam ser se esses são comandos separados.
Se sh realmente não chamar Bash, provavelmente haveria uma página homem separado.
Alguns sistemas possuem páginas de manual em separado apenas para o C-shell comandos internos.
Às vezes, se você quiser ler a descrição de um comando embutido
que também é o caminho, como eco, você precisa ler a página de manual em que comando o eco
para determinar como ele vai funcionar como um comando embutido
mesmo se você não está chamando o comando embutido.
Isto é uma desvantagem do sistema operativo, em geral, não só para os reservatórios,
embora para as conchas, em particular as páginas do manual são bastante longo,
em parte porque eles adicionaram características úteis para eles, o que pode ser um positivo.
Okay. Alguma pergunta? Quaisquer tópicos que pretende trazer?
Qualquer coisa relevante aqui?
Bem, foi muito bom falar com você todos.
Eu espero que você tenha algo fora deste seminário
que serão úteis para você em seus futuros empreendimentos.
[CS50.TV]