Fatmawati Achmad Zaenuri / Shutterstock
Os estranhos "documentos aqui" permitem que você use o redirecionamento de entrada/saída dentro de scripts Bash no Linux. Eles são uma ótima maneira de automatizar os comandos que você precisa para executar em um computador remoto.
índice
- Aqui Documentos
- Aqui Documenta Noções Básicas
- exemplos simples
- Manipulando caracteres de tabulação
- Redirecionar para um arquivo
- Encaminhando a saída para outro comando
- Enviar parâmetros para uma função
- Criar e enviar um e-mail
- Usando documentos aqui com SSH
- Nome estranho, características legais
Aqui Documentos
Muitos comandos no Linux têm nomes de duas ou três letras. Isso é em parte o que dá origem à ideia de que o Linux é difícil de aprender e cheio de comandos misteriosos. Mas um dos nomes mais estranhos no Linux não é um dos cripticamente curtos. Os "documentos aqui" não são documentos e nem fica claro a que se refere o "aqui".
Eles são uma construção relativamente obscura, mas são úteis. Obviamente, isso é Linux, então há mais de uma maneira de esfolar um gato. Algumas das funcionalidades fornecidas pelos documentos aqui podem ser reproduzidas de outras maneiras. Esses métodos alternativos são geralmente mais complicados. Em programação e script, "mais complicado" também significa "mais propenso a erros" e que o código é mais difícil de manter.
Onde os documentos aqui realmente se destacam em automatizar os comandos que você deseja enviar para um computador remoto a partir de uma conexão estabelecida de dentro de um script. A conexão é fácil, mas uma vez que a conexão é estabelecida, como você "bombe" os comandos de script para o shell do computador remoto? Aqui os documentos permitem que você faça isso com muita facilidade.
Aqui Documenta Noções Básicas
A representação idiomática de um documento aqui se parece com isso:
COMANDO << limit_string . . variáveis de dados de texto. . limit_string
- COMMAND : Pode ser qualquer comando do Linux que aceite entrada redirecionada. Observe que o comando
echo
não aceita entrada redirecionada. Se você precisar gravar na tela, poderá usar o comandocat
file, que faz . - < : O operador de redirecionamento.
- string_limit : Este é um rótulo. Pode ser o que você quiser, desde que não apareça na lista de dados que você está redirecionando para o comando. É usado para marcar o final da lista de texto, dados e variáveis.
- data list : Uma lista de dados a serem fornecidos ao comando. Pode conter comandos, texto e variáveis. O conteúdo da lista de dados é inserido no comando uma linha por vez até que _limit_string seja encontrado.
Você provavelmente verá exemplos de documentos aqui que usam "EOF" como a string delimitadora. Não somos a favor desta abordagem. Funciona, mas "EOF" significa "Fim do arquivo". Com exceção do caso raro em que um documento de inicialização é a última coisa em um arquivo de script, "EOF" é usado incorretamente.
Isso tornará seus scripts muito mais legíveis se você usar uma string delimitadora que se refira ao que você está fazendo. Se você estiver enviando uma série de comandos para um computador remoto via Secure Shell (SSH), uma string de limite chamada algo como "_remote_commands" faria muito sentido. Não é necessário começar com um caractere de sublinhado " _
". Fazemos isso porque você os marca como fora do comum em seu roteiro.
exemplos simples
Você pode usar os documentos na linha de comando e em scripts aqui. Ao digitar o seguinte em uma janela de terminal, você verá um prompt " >
" para a continuação da linha toda vez que pressionar "Enter". Quando você digita a string de limite "_end_of_text" e pressiona "Enter", a lista de sites cat,
e eles são exibidos na janela do terminal.
cat << _end_of_text How-To Geek Review Geek LifeSavvy CloudSavvy IT MindBounce _end_of_text
Não é o exercício mais útil, mas mostra que nada é enviado ao comando até que toda a lista de dados seja coletada e a string limite seja encontrada. O comando cat
não recebe entrada até que a string de limite "_end_of_text" seja inserida e a tecla "Enter" seja pressionada.
Podemos fazer a mesma coisa em um script. Digite ou copie este exemplo em um editor, salve o arquivo como "heredoc-1.sh" e feche o editor.
#!/bin/bash cat << "_end_of_text" Seu nome de usuário é: $(whoami) Seu diretório de trabalho atual é: $PWD Sua versão do Bash é: $BASH_VERSION _end_of_text
Ao longo deste artigo, sempre que criar um script, você deve torná-lo executável antes de ser executado. De qualquer forma, use o comando chmod
. Substitua o nome do script em cada exemplo pelo nome do script usado aqui.
chmod +x heredoc-1.sh
Este script contém duas variáveis de ambiente, $PWD
é $BASH_VERSION
. Os nomes das variáveis de ambiente são substituídos por seus valores de dados (o diretório de trabalho atual e a versão do Bash) quando o script é executado.
O script também usa a substituição de cheques no comando whoami
. O nome do comando é substituído por sua própria saída. A saída de todo o script é gravada na janela do terminal usando o comando cat. Vamos executar o script chamando-o pelo nome:
./heredoc-1.sh
Se você editar o script e colocar a string limite na primeira linha do documento entre aspas aqui " "
", a palavra-chave é passada para o datalist para o comando aqui no documento. Os nomes das variáveis são exibidos ao invés dos valores das variáveis e a substituição do comando não será realizada.
#!/bin/bash cat <<- "_end_of_text" Seu nome de usuário é: $(whoami) Seu diretório de trabalho atual é: $PWD Sua versão do Bash é: $BASH_VERSION _end_of_text
Manipulando caracteres de tabulação
Por padrão, os caracteres de tabulação na lista de dados serão preservados e gravados na janela do terminal. Copie e salve este exemplo como "heredoc-2.sh". Torne-o executável usando o comando chmod
. Edite linhas recuadas para garantir que elas tenham um ou dois caracteres de tabulação no início da linha em vez de uma série de espaços.
#!/bin/bash cat << _end_of_text Seu nome de usuário é: $(whoami) Seu diretório de trabalho atual é: $PWD Sua versão do Bash é: $BASH_VERSION _end_of_text
./heredoc-2.sh
As guias são gravadas na janela do terminal.
Ao adicionar um traço " -
"no operador de redirecionamento, o documento aqui irá ignorar os caracteres de tabulação à esquerda. Salve este exemplo como "heredoc-3.sh" e torne-o executável.
#!/bin/bash cat <<- _end_of_text Seu nome de usuário é: $(whoami) Seu diretório de trabalho atual é: $PWD Sua versão do Bash é: $BASH_VERSION _end_of_text
./heredoc-3.sh
As cartas são ignoradas. Isso pode parecer trivial, mas é uma boa maneira de lidar com as guias iniciais por causa das seções recuadas dos scripts.
Loops e outras construções lógicas geralmente são recuados. Se o seu documento aqui estiver contido em uma seção recuada de um script, use um hífen " -
"Com o operador de redirecionamento, os problemas de formatação causados por caracteres de tabulação à esquerda são eliminados.
#!/bin/bash se verdadeiro; então cat <<- _limit_string Linha 1 com uma tabulação inicial. Linha 2 com uma tabulação inicial. Linha 3 com uma tabulação inicial. _limit_string fi
Redirecionar para um arquivo
A saída do comando usada com o documento aqui pode ser redirecionada para um arquivo. Use os operadores de redirecionamento " >
"(criar arquivo) ou " >>
"(criar arquivo se não existir, adicionar ao arquivo se existir) após a string de limite na primeira linha do documento.
Este script é "heredoc-4.sh". Redirecione sua saída para um arquivo de texto chamado "session.txt".
#!/bin/bash cat << _end_of_text > session.txt Seu nome de usuário é: $(whoami) Seu diretório de trabalho atual é: $PWD Sua versão do Bash é: $BASH_VERSION _end_of_text
./heredoc-4.sh
sessão de gato.texto
Encaminhando a saída para outro comando
A saída do comando usada em um documento aqui pode ser redirecionada como entrada para outro comando. Use o operador pipe " |
" após a string de limite na primeira linha do documento aqui. Vamos redirecionar a saída do comando aqui document, cat
, para sed
. Queremos substituir todas as ocorrências da letra "a" pela letra "e".
Nomeie este script como "heredoc-5.sh".
#!/bin/bash cat << _end_of_text | sed 's/a/e/g' Como Gaak _end_of_text
./heredoc-5.sh
"Gaak" é corrigido para "Geek".
Enviar parâmetros para uma função
O comando usado com um documento aqui pode ser uma função no script.
Este script passa alguns dados do veículo para uma função. A função lê os dados como se tivessem sido escritos por um usuário. Os valores das variáveis são então impressos. Salve este script como "heredoc-6.sh".
#!/bin/bash # a função set_car_details() set_car_details () { read make read model read new_used read delivery_collect read location read price } # O documento here que passa os dados para set_car_details() set_car_details << _mars_rover_data NASA Perseverance Rover Usado Collect Mars (long,lat) 77.451865,18.445161 2.2 bilhões _mars_rover_data # Recuperar os detalhes do veículo echo "Fabricar: $make" echo "Modelo: $model" echo "Novo ou usado: $new_used" echo "Entrega ou Coleta: $delivery_collect" echo "Localização: $localização" echo "Preço $: $preço"
./heredoc-6.sh
Os detalhes do veículo são escritos na janela do terminal.
Criar e enviar um e-mail
Podemos usar um documento aqui para redigir e enviar um e-mail. Observe que podemos passar parâmetros para o comando na frente do operador de redirecionamento. Estamos usando o comando de mail
do Linux para enviar um e-mail através de seu sistema de correio local para a conta de usuário chamada "dave". A opção -s
(assunto) nos permite especificar o assunto do email.
Este exemplo forma o script "heredoc-7.sh".
#!/bin/bash article="Aqui Documentos" mail -s 'Status da carga de trabalho' dave << _project_report Nome de usuário: $(whoami) Completou a tarefa: Artigo: $article _project_report
./heredoc-7.sh
Não há saída visível deste script. Mas quando verificamos nosso e-mail, vemos que o e-mail foi composto, enviado e entregue.
correspondência
Usando documentos aqui com SSH
Os documentos aqui são uma maneira poderosa e conveniente de executar alguns comandos em um computador remoto assim que uma conexão SSH for estabelecida. Se você configurou chaves SSH entre os dois computadores, o processo de login será totalmente automático. Neste exemplo rápido e sujo, você será solicitado a fornecer a senha da conta de usuário no computador remoto.
Este script é "heredoc-8.sh". Vamos nos conectar a um computador remoto chamado "pc remoto". A conta de usuário é denominada "dave". Estamos usando o -T
(desativar atribuição de pseudo-terminal) porque não precisamos receber um pseudo-terminal interativo.
Na seção "faça algum trabalho aqui" do script, poderíamos passar uma lista de comandos, e estes seriam executados no computador remoto. Claro, você poderia simplesmente chamar um script que estava no computador remoto. O script remoto pode conter todos os comandos e rotinas que você deseja executar.
Tudo que nosso script, heredoc-8.sh, fará é atualizar um registro de conexão no computador remoto. A conta de usuário e um carimbo de data/hora são registrados em um arquivo de texto.
#!/bin/bash ssh -T [email protected] << _remote_commands # faça algum trabalho aqui # atualize o log de conexão echo $USER "-" $(date) >> /home/dave/conn_log/script.log _remote_commands
Quando executamos o comando, somos solicitados a fornecer a senha da conta em seu computador remoto .
./heredoc-8.sh
Algumas informações sobre o computador remoto são exibidas e você retorna ao prompt de comando.
No computador remoto , podemos usar cat
para verificar o log de conexão:
cat conn_log/script.log
Cada conexão é listada para nós.
Nome estranho, características legais
Os documentos aqui são estranhos, mas poderosos, especialmente quando usados para enviar comandos para um computador remoto. Seria fácil escrever uma rotina de backup usando rsync
. O script pode então se conectar ao computador remoto, verificar o espaço de armazenamento restante e enviar um alerta por e-mail se houver pouco espaço.
- Uma VPN realmente torna sua atividade online privada?
- Como usar o estado em componentes Functional React
descubra mais conteúdo
O que é um amplificador integrado?
Google Pixel Watch também tem detecção de queda, mas não até o próximo ano
As melhores xícaras de café aquecidas de 2022
Como automatizar seu iPhone com base na hora, atividade ou localização
"Isso deve ter sido antes do meu tempo"
Por que a NASA enviou Snoopy para a Lua? – Revisão Geek
Deixe uma resposta Cancelar resposta
Heredoc é uma forma de representar strings nas linguagens de programação ou shells de algum Sistema Operacional baseado em Unix. As linguagens de programação que mais o utilizam são PHP e Ruby.
Qual string de texto delimita um heredoc?
Uma das maneiras adicionais de delimitar uma string é usando a sintaxe heredoc : <<<. Após este operador, deve ser fornecido um identificador, seguido de uma nova linha. Em seguida vai a própria string, e para fechar a notação é colocado o mesmo identificador.
Como escapar aspas em PHP?
1. Aspas simples. A maneira mais simples de delimitar uma string é: 'string'. Se você quiser especificar uma aspa simples em uma string, escape-a com uma barra invertida \\ e faça o mesmo para especificar uma barra invertida em uma string \\.